Merge "Normalize `input[type="search"]`"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 11 Apr 2016 17:45:49 +0000 (17:45 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 11 Apr 2016 17:45:49 +0000 (17:45 +0000)
220 files changed:
autoload.php
docs/hooks.txt
docs/injection.txt
includes/ForkController.php
includes/GlobalFunctions.php
includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/Services/CannotReplaceActiveServiceException.php [new file with mode: 0644]
includes/Services/ContainerDisabledException.php [new file with mode: 0644]
includes/Services/DestructibleService.php [new file with mode: 0644]
includes/Services/NoSuchServiceException.php [new file with mode: 0644]
includes/Services/ServiceAlreadyDefinedException.php [new file with mode: 0644]
includes/Services/ServiceContainer.php
includes/Services/ServiceDisabledException.php [new file with mode: 0644]
includes/Setup.php
includes/WatchedItemStore.php
includes/api/i18n/es.json
includes/api/i18n/lb.json
includes/config/ConfigFactory.php
includes/context/RequestContext.php
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LoadBalancer.php
includes/installer/DatabaseInstaller.php
includes/installer/Installer.php
includes/installer/i18n/he.json
includes/installer/i18n/pt.json
includes/installer/i18n/sv.json
includes/logging/RightsLogFormatter.php
includes/media/Exif.php
includes/session/SessionManager.php
includes/site/SiteSQLStore.php
includes/user/CentralIdLookup.php
includes/user/User.php
languages/i18n/af.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lki.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/new.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdh.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/xal.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/rebuildLocalisationCache.php
resources/Resources.php
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less [new file with mode: 0644]
resources/src/mediawiki/api/upload.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.js
tests/parser/parserTest.inc
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/WatchedItemUnitTest.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/phpunit.php

index c3e988c..847e291 100644 (file)
@@ -794,7 +794,13 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
        'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MediaWiki\\MediaWikiServices' => __DIR__ . '/includes/MediaWikiServices.php',
+       'MediaWiki\\Services\\CannotReplaceActiveServiceException' => __DIR__ . '/includes/Services/CannotReplaceActiveServiceException.php',
+       'MediaWiki\\Services\\ContainerDisabledException' => __DIR__ . '/includes/Services/ContainerDisabledException.php',
+       'MediaWiki\\Services\\DestructibleService' => __DIR__ . '/includes/Services/DestructibleService.php',
+       'MediaWiki\\Services\\NoSuchServiceException' => __DIR__ . '/includes/Services/NoSuchServiceException.php',
+       'MediaWiki\\Services\\ServiceAlreadyDefinedException' => __DIR__ . '/includes/Services/ServiceAlreadyDefinedException.php',
        'MediaWiki\\Services\\ServiceContainer' => __DIR__ . '/includes/Services/ServiceContainer.php',
+       'MediaWiki\\Services\\ServiceDisabledException' => __DIR__ . '/includes/Services/ServiceDisabledException.php',
        'MediaWiki\\Session\\BotPasswordSessionProvider' => __DIR__ . '/includes/session/BotPasswordSessionProvider.php',
        'MediaWiki\\Session\\CookieSessionProvider' => __DIR__ . '/includes/session/CookieSessionProvider.php',
        'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' => __DIR__ . '/includes/session/ImmutableSessionProviderWithCookie.php',
index 31e9d92..9c14607 100644 (file)
@@ -1997,9 +1997,18 @@ $user: $wgUser
 $request: $wgRequest
 $mediaWiki: The $mediawiki object
 
-'MediaWikiServices': Override services in the default MediaWikiServices instance.
-Extensions may use this to define, replace, or wrap existing services.
-However, the preferred way to define a new service is the $wgServiceWiringFiles array.
+'MediaWikiServices': Called when a global MediaWikiServices instance is
+initialized. Extensions may use this to define, replace, or wrap services.
+However, the preferred way to define a new service is
+the $wgServiceWiringFiles array.
+$services: MediaWikiServices
+
+'MediaWikiServices::resetLegacyServices': Called when MediaWikiServices resets
+global instances of all well known services that are not yet managed by
+MediaWikiServices directly. Extension may use this hook to reset their own
+global service instances. However, it is preferred for extensions to have their
+services managed by MediaWikiServices directly, by registering them
+via $wgServiceWiringFiles or the 'MediaWikiServices' hook.
 $services: MediaWikiServices
 
 'MessageCache::get': When fetching a message. Can be used to override the key
index e0466c4..219e49d 100644 (file)
@@ -37,6 +37,15 @@ DI framework. Per default, $wgServiceWiringFiles lists
 includes/ServiceWiring.php, which defines all default service
 implementations, and specifies how they depend on each other ("wiring").
 
+Note that services get their configuration injected, and changes to global
+configuration variables will not have any effect on services that were already
+instantiated. This would typically be the case for low level services like
+the ConfigFactory or the ObjectCacheManager, which are used during extension
+registration. To address this issue, Setup.php resets the global service
+locator instance by calling MediaWikiServices::resetGlobalInstance() once
+configuration and extension registration is complete.
+
+
 When a new service is added to MediaWiki core, an instantiator function
 that will create the appropriate default instance for that service must
 be added to ServiceWiring.php. This makes the service available through
index 2725753..655d756 100644 (file)
@@ -133,7 +133,8 @@ class ForkController {
                                $this->termReceived = false;
                        }
                } while ( count( $this->children ) );
-               pcntl_signal( SIGTERM, SIG_DFL );
+
+               $this->initProcess();
                return 'done';
        }
 
@@ -149,14 +150,12 @@ class ForkController {
 
        protected function prepareEnvironment() {
                global $wgMemc;
-               // Don't share DB, storage, or memcached connections
-               wfGetLBFactory()->destroyInstance();
-               FileBackendGroup::destroySingleton();
-               LockManagerGroup::destroySingletons();
-               JobQueueGroup::destroySingletons();
-               ObjectCache::clear();
-               RedisConnectionPool::destroySingletons();
-               $wgMemc = null;
+               $wgMemc = null; // TODO: change all code that accesses this directly!
+
+               // NOTE: we want to destroy global service instances before forking,
+               // so no external resources such as database connections get copied
+               // to the child processes.
+               \MediaWiki\MediaWikiServices::disableStorageBackend();
        }
 
        /**
@@ -178,7 +177,7 @@ class ForkController {
                        }
 
                        if ( !$pid ) {
-                               $this->initChild();
+                               $this->initProcess();
                                $this->childNumber = $i;
                                return 'child';
                        } else {
@@ -190,9 +189,10 @@ class ForkController {
                return 'parent';
        }
 
-       protected function initChild() {
-               global $wgMemc, $wgMainCacheType;
-               $wgMemc = wfGetCache( $wgMainCacheType );
+       protected function initProcess() {
+               // Reset services, so we don't re-use connections.
+               \MediaWiki\MediaWikiServices::resetChildProcessServices();
+
                $this->children = null;
                pcntl_signal( SIGTERM, SIG_DFL );
        }
index 5c42bc2..8c55d9a 100644 (file)
@@ -3109,6 +3109,9 @@ function wfSplitWikiID( $wiki ) {
  * Note 2: use $this->getDB() in maintenance scripts that may be invoked by
  * updater to ensure that a proper database is being updated.
  *
+ * @todo Replace calls to wfGetDB with calls to LoadBalancer::getConnection()
+ *       on an injected instance of LoadBalancer.
+ *
  * @return DatabaseBase
  */
 function wfGetDB( $db, $groups = [], $wiki = false ) {
@@ -3118,20 +3121,30 @@ function wfGetDB( $db, $groups = [], $wiki = false ) {
 /**
  * Get a load balancer object.
  *
+ * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancer()
+ *              or MediaWikiServices::getDBLoadBalancerFactory() instead.
+ *
  * @param string|bool $wiki Wiki ID, or false for the current wiki
  * @return LoadBalancer
  */
 function wfGetLB( $wiki = false ) {
-       return wfGetLBFactory()->getMainLB( $wiki );
+       if ( $wiki === false ) {
+               return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer();
+       } else {
+               $factory = \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               return $factory->getMainLB( $wiki );
+       }
 }
 
 /**
  * Get the load balancer factory object
  *
+ * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead.
+ *
  * @return LBFactory
  */
 function wfGetLBFactory() {
-       return LBFactory::singleton();
+       return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
 }
 
 /**
index 7b1def9..dd66967 100644 (file)
@@ -1,15 +1,41 @@
 <?php
 namespace MediaWiki;
 
+use ApiQueryInfo;
+use CentralIdLookup;
+use Config;
 use ConfigFactory;
+use DeferredUpdates;
+use FileBackendGroup;
 use GlobalVarConfig;
-use Config;
 use Hooks;
+use IP;
+use JobQueueAggregator;
+use Language;
 use LBFactory;
+use LinkCache;
 use LoadBalancer;
+use LockManagerGroup;
+use MagicWord;
+use MediaHandler;
 use MediaWiki\Services\ServiceContainer;
+use MediaWiki\Session\SessionManager;
+use MessageCache;
+use MWException;
+use MWNamespace;
+use MWTidy;
+use ObjectCache;
+use RedisConnectionPool;
+use RepoGroup;
+use RequestContext;
+use ResourceLoader;
 use SiteLookup;
 use SiteStore;
+use SpecialPageFactory;
+use Title;
+use User;
+use WatchedItemStore;
+use Wikimedia\Assert\Assert;
 
 /**
  * Service locator for MediaWiki core services.
@@ -49,6 +75,11 @@ use SiteStore;
  */
 class MediaWikiServices extends ServiceContainer {
 
+       /**
+        * @var MediaWikiServices|null
+        */
+       private static $instance = null;
+
        /**
         * Returns the global default instance of the top level service locator.
         *
@@ -62,27 +93,286 @@ class MediaWikiServices extends ServiceContainer {
         * @return MediaWikiServices
         */
        public static function getInstance() {
-               static $instance = null;
-
-               if ( $instance === null ) {
+               if ( self::$instance === null ) {
                        // NOTE: constructing GlobalVarConfig here is not particularly pretty,
                        // but some information from the global scope has to be injected here,
                        // even if it's just a file name or database credentials to load
                        // configuration from.
-                       $config = new GlobalVarConfig();
-                       $instance = new self( $config );
+                       $bootstrapConfig = new GlobalVarConfig();
+                       self::$instance = self::newInstance( $bootstrapConfig );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Replaces the global MediaWikiServices instance.
+        *
+        * @note This is for use in PHPUnit tests only!
+        *
+        * @throws MWException if called outside of PHPUnit tests.
+        *
+        * @param MediaWikiServices $services The new MediaWikiServices object.
+        *
+        * @return MediaWikiServices The old MediaWikiServices object, so it can be restored later.
+        */
+       public static function forceGlobalInstance( MediaWikiServices $services ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( __METHOD__ . ' must not be used outside unit tests.' );
+               }
+
+               $old = self::getInstance();
+               self::$instance = $services;
 
-                       // Load the default wiring from the specified files.
-                       $wiringFiles = $config->get( 'ServiceWiringFiles' );
-                       $instance->loadWiringFiles( $wiringFiles );
+               self::resetLegacyServices();
 
-                       // Provide a traditional hook point to allow extensions to configure services.
-                       Hooks::run( 'MediaWikiServices', [ $instance ] );
+               return $old;
+       }
+
+       /**
+        * Creates a new instance of MediaWikiServices and sets it as the global default
+        * instance. getInstance() will return a different MediaWikiServices object
+        * after every call to resetGlobalServiceLocator().
+        *
+        * @warning This should not be used during normal operation. It is intended for use
+        * when the configuration has changed significantly since bootstrap time, e.g.
+        * during the installation process or during testing.
+        *
+        * @warning Calling resetGlobalServiceLocator() may leave the application in an inconsistent
+        * state. Calling this is only safe under the ASSUMPTION that NO REFERENCE to
+        * any of the services managed by MediaWikiServices exist. If any service objects
+        * managed by the old MediaWikiServices instance remain in use, they may INTERFERE
+        * with the operation of the services managed by the new MediaWikiServices.
+        * Operating with a mix of services created by the old and the new
+        * MediaWikiServices instance may lead to INCONSISTENCIES and even DATA LOSS!
+        * Any class implementing LAZY LOADING is especially prone to this problem,
+        * since instances would typically retain a reference to a storage layer service.
+        *
+        * @see forceGlobalInstance()
+        * @see resetGlobalInstance()
+        * @see resetBetweenTest()
+        *
+        * @param Config|null $bootstrapConfig The Config object to be registered as the
+        *        'BootstrapConfig' service. This has to contain at least the information
+        *        needed to set up the 'ConfigFactory' service. If not given, the bootstrap
+        *        config of the old instance of MediaWikiServices will be re-used. If there
+        *        was no previous instance, a new GlobalVarConfig object will be used to
+        *        bootstrap the services.
+        *
+        * @throws MWException
+        */
+       public static function resetGlobalInstance( Config $bootstrapConfig = null ) {
+               if ( self::$instance === null ) {
+                       // no global instance yet, nothing to reset
+                       return;
                }
 
+               if ( $bootstrapConfig === null ) {
+                       $bootstrapConfig = self::$instance->getBootstrapConfig();
+               }
+
+               self::$instance->destroy();
+
+               self::$instance = self::newInstance( $bootstrapConfig );
+
+               self::resetLegacyServices();
+       }
+
+       /**
+        * Creates a new MediaWikiServices instance and initializes it according to the
+        * given $bootstrapConfig. In particular, all wiring files defined in the
+        * ServiceWiringFiles setting are loaded, and the MediaWikiServices hook is called.
+        *
+        * @param Config|null $bootstrapConfig The Config object to be registered as the
+        *        'BootstrapConfig' service. This has to contain at least the information
+        *        needed to set up the 'ConfigFactory' service. If not provided, any call
+        *        to getBootstrapConfig(), getConfigFactory, or getMainConfig will fail.
+        *        A MediaWikiServices instance without access to configuration is called
+        *        "primordial".
+        *
+        * @return MediaWikiServices
+        * @throws MWException
+        */
+       private static function newInstance( Config $bootstrapConfig ) {
+               $instance = new self( $bootstrapConfig );
+
+               // Load the default wiring from the specified files.
+               $wiringFiles = $bootstrapConfig->get( 'ServiceWiringFiles' );
+               $instance->loadWiringFiles( $wiringFiles );
+
+               // Provide a traditional hook point to allow extensions to configure services.
+               Hooks::run( 'MediaWikiServices', [ $instance ] );
+
                return $instance;
        }
 
+       /**
+        * Resets global instances of services that have not yet been ported to using
+        * MediaWikiServices to manage their default instance.
+        *
+        * @note eventually, all global service instances are to be managed by MediaWikiServices.
+        * To emulate the effect of resetting the global service locator, we reset the individual
+        * static singletons for now.
+        *
+        * @note As long as we don't know the interdependencies between the services, the only way
+        * to reset services consistently is to reset all services at once. This should be ok since
+        * there should rarely be a need to reset all processes.
+        */
+       private static function resetLegacyServices() {
+               global $wgContLang, $wgUser, $wgMemc, $wgRequest;
+
+               $services = self::getInstance();
+               $config = $services->getMainConfig();
+
+               // NOTE: all the services instance that get reset below should be migrated
+               // to be managed by MediaWikiServices. Eventually, this method can then be
+               // removed.
+
+               User::resetIdByNameCache();
+               LinkCache::singleton()->clear();
+               Title::clearCaches();
+
+               MWTidy::destroySingleton();
+               MagicWord::clearCache();
+               SpecialPageFactory::resetList();
+               JobQueueAggregator::destroySingleton();
+               DeferredUpdates::clearPendingUpdates();
+               CentralIdLookup::resetCache();
+               MediaHandler::resetCache();
+               IP::clearCaches();
+               ResourceLoader::clearCache();
+
+               ApiQueryInfo::resetTokenCache();
+
+               RepoGroup::destroySingleton();
+
+               MessageCache::destroyInstance();
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               Language::$mLangObjCache = [];
+               Language::getLocalisationCache()->unloadAll();
+
+               ObjectCache::clear();
+               RedisConnectionPool::destroySingletons();
+               FileBackendGroup::destroySingleton();
+               LockManagerGroup::destroySingletons();
+
+               RequestContext::resetMain();
+               $wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
+
+               $wgContLang = Language::factory( $config->get( 'LanguageCode' ) );
+               $wgContLang->resetNamespaces(); # reset namespace cache
+
+               $wgMemc = ObjectCache::getLocalClusterInstance();
+               $wgUser = RequestContext::getMain()->getUser();
+
+               SessionManager::resetCache();
+
+               // Provide a hook point for extensions that need to reset global service instances.
+               Hooks::run( 'MediaWikiServices::resetLegacyServices', [ $services ] );
+       }
+
+       /**
+        * Disables all storage layer services. After calling this, any attempt to access the
+        * storage layer will result in an error. Use resetGlobalInstance() to restore normal
+        * operation.
+        *
+        * @warning This is intended for extreme situations only and should never be used
+        * while serving normal web requests. Legitimate use cases for this method include
+        * the installation process. Test fixtures may also use this, if the fixture relies
+        * on globalState.
+        *
+        * @see resetGlobalInstance()
+        * @see resetChildProcessServices()
+        */
+       public static function disableStorageBackend() {
+               // TODO: also disable some Caches, JobQueues, etc
+               $destroy = [ 'DBLoadBalancer', 'DBLoadBalancerFactory' ];
+               $services = self::getInstance();
+
+               foreach ( $destroy as $name ) {
+                       $services->disableService( $name );
+               }
+       }
+
+       /**
+        * Resets any services that may have become stale after a child process
+        * returns from after pcntl_fork(). It's also safe, but generally unnecessary,
+        * to call this method from the parent process.
+        *
+        * @note This is intended for use in the context of process forking only!
+        *
+        * @see resetGlobalInstance()
+        * @see disableStorageBackend()
+        */
+       public static function resetChildProcessServices() {
+               // NOTE: for now, just reset everything. Since we don't know the interdependencies
+               // between services, we can't do this more selectively at this time.
+               self::resetGlobalInstance();
+
+               // Child, reseed because there is no bug in PHP:
+               // http://bugs.php.net/bug.php?id=42465
+               mt_srand( getmypid() );
+       }
+
+       /**
+        * Resets the given service for testing purposes.
+        *
+        * @warning This is generally unsafe! Other services may still retain references
+        * to the stale service instance, leading to failures and inconsistencies. Subclasses
+        * may use this method to reset specific services under specific instances, but
+        * it should not be exposed to application logic.
+        *
+        * @note With proper dependency injection used throughout the codebase, this method
+        * should not be needed. It is provided to allow tests that pollute global service
+        * instances to clean up.
+        *
+        * @param string $name
+        * @param string $destroy Whether the service instance should be destroyed if it exists.
+        *        When set to false, any existing service instance will effectively be detached
+        *        from the container.
+        *
+        * @throws MWException if called outside of PHPUnit tests.
+        */
+       public function resetServiceForTesting( $name, $destroy = true ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'resetServiceForTesting() must not be used outside unit tests.' );
+               }
+
+               $this->resetService( $name, $destroy );
+       }
+
+       /**
+        * Convenience method that throws an exception if called outside the service bootstrapping
+        * phase as indicated by the MW_SERVICE_BOOTSTRAP_COMPLETE constant - that is, after
+        * Setup.php has called resetGlobalInstance(). Additionally, no exception is thrown if
+        * this method is called during unit testing (as indicated by MW_PHPUNIT_TEST) or
+        * during installation (as indicated by MEDIAWIKI_INSTALL).
+        *
+        * This method is intended to be used to safeguard against accidentally resetting
+        * global service instances that are not yet managed by MediaWikiServices. It is
+        * defined here in the MediaWikiServices services class to keep the knowledge about
+        * how the bootstrapping phase is managed central.
+        *
+        * @param string $method the name of the caller method, as given by __METHOD__.
+        *
+        * @throws MWException if called outside bootstrap mode.
+        *
+        * @see resetGlobalInstance()
+        * @see forceGlobalInstance()
+        * @see disableStorageBackend()
+        */
+       public static function failUnlessBootstrapping( $method ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' )
+                       && !defined( 'MEDIAWIKI_INSTALL' )
+                       && defined( 'MW_SERVICE_BOOTSTRAP_COMPLETE' )
+               ) {
+                       throw new MWException( $method . ' may only be called during bootstrapping unit tests!' );
+               }
+
+               ObjectCache::clear();
+       }
+
        /**
         * @param Config $config The Config object to be registered as the 'BootstrapConfig' service.
         *        This has to contain at least the information needed to set up the 'ConfigFactory'
@@ -91,12 +381,14 @@ class MediaWikiServices extends ServiceContainer {
        public function __construct( Config $config ) {
                parent::__construct();
 
-               // register the given Config object as the bootstrap config service.
+               // Register the given Config object as the bootstrap config service.
                $this->defineService( 'BootstrapConfig', function() use ( $config ) {
                        return $config;
                } );
        }
 
+       // CONVENIENCE GETTERS ////////////////////////////////////////////////////
+
        /**
         * Returns the Config object containing the bootstrap configuration.
         * Bootstrap configuration would typically include database credentials
@@ -144,6 +436,27 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'SiteStore' );
        }
 
+       /**
+        * @return LBFactory
+        */
+       public function getDBLoadBalancerFactory() {
+               return $this->getService( 'DBLoadBalancerFactory' );
+       }
+
+       /**
+        * @return LoadBalancer The main DB load balancer for the local wiki.
+        */
+       public function getDBLoadBalancer() {
+               return $this->getService( 'DBLoadBalancer' );
+       }
+
+       /**
+        * @return WatchedItemStore
+        */
+       public function getWatchedItemStore() {
+               return $this->getService( 'WatchedItemStore' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index d8709b9..dc2c66b 100644 (file)
 use MediaWiki\MediaWikiServices;
 
 return [
+       'DBLoadBalancerFactory' => function( MediaWikiServices $services ) {
+               // NOTE: Defining the LBFactory class via LBFactoryConf is supported for
+               // backwards compatibility. The preferred way would be to register a
+               // callback for DBLoadBalancerFactory that constructs the desired LBFactory
+               // directly.
+               $config = $services->getMainConfig()->get( 'LBFactoryConf' );
+
+               $class = LBFactory::getLBFactoryClass( $config );
+               if ( !isset( $config['readOnlyReason'] ) ) {
+                       // TODO: replace the global wfConfiguredReadOnlyReason() with a service.
+                       $config['readOnlyReason'] = wfConfiguredReadOnlyReason();
+               }
+
+               return new $class( $config );
+       },
+
+       'DBLoadBalancer' => function( MediaWikiServices $services ) {
+               // just return the default LB from the DBLoadBalancerFactory service
+               return $services->getDBLoadBalancerFactory()->getMainLB();
+       },
+
        'SiteStore' => function( MediaWikiServices $services ) {
-               $loadBalancer = wfGetLB(); // TODO: use LB from MediaWikiServices
-               $rawSiteStore = new DBSiteStore( $loadBalancer );
+               $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
 
                // TODO: replace wfGetCache with a CacheFactory service.
                // TODO: replace wfIsHHVM with a capabilities service.
@@ -72,6 +92,15 @@ return [
                return $services->getConfigFactory()->makeConfig( 'main' );
        },
 
+       'WatchedItemStore' => function( MediaWikiServices $services ) {
+               $store = new WatchedItemStore(
+                       $services->getDBLoadBalancer(),
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+               );
+               $store->setStatsdDataFactory( RequestContext::getMain()->getStats() );
+               return $store;
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
diff --git a/includes/Services/CannotReplaceActiveServiceException.php b/includes/Services/CannotReplaceActiveServiceException.php
new file mode 100644 (file)
index 0000000..4993073
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+namespace MediaWiki\Services;
+
+use Exception;
+use RuntimeException;
+
+/**
+ * Exception thrown when trying to replace an already active service.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * Exception thrown when trying to replace an already active service.
+ */
+class CannotReplaceActiveServiceException extends RuntimeException {
+
+       /**
+        * @param string $serviceName
+        * @param Exception|null $previous
+        */
+       public function __construct( $serviceName, Exception $previous = null ) {
+               parent::__construct( "Cannot replace an active service: $serviceName", 0, $previous );
+       }
+
+}
diff --git a/includes/Services/ContainerDisabledException.php b/includes/Services/ContainerDisabledException.php
new file mode 100644 (file)
index 0000000..ede076d
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+namespace MediaWiki\Services;
+
+use Exception;
+use RuntimeException;
+
+/**
+ * Exception thrown when trying to access a service on a disabled container or factory.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * Exception thrown when trying to access a service on a disabled container or factory.
+ */
+class ContainerDisabledException extends RuntimeException {
+
+       /**
+        * @param Exception|null $previous
+        */
+       public function __construct( Exception $previous = null ) {
+               parent::__construct( 'Container disabled!', 0, $previous );
+       }
+
+}
diff --git a/includes/Services/DestructibleService.php b/includes/Services/DestructibleService.php
new file mode 100644 (file)
index 0000000..6ce9af2
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+namespace MediaWiki\Services;
+
+/**
+ * Interface for destructible services.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * DestructibleService defines a standard interface for shutting down a service instance.
+ * The intended use is for a service container to be able to shut down services that should
+ * no longer be used, and allow such services to release any system resources.
+ *
+ * @note There is no expectation that services will be destroyed when the process (or web request)
+ * terminates.
+ */
+interface DestructibleService {
+
+       /**
+        * Notifies the service object that it should expect to no longer be used, and should release
+        * any system resources it may own. The behavior of all service methods becomes undefined after
+        * destroy() has been called. It is recommended that implementing classes should throw an
+        * exception when service methods are accessed after destroy() has been called.
+        */
+       public function destroy();
+
+}
diff --git a/includes/Services/NoSuchServiceException.php b/includes/Services/NoSuchServiceException.php
new file mode 100644 (file)
index 0000000..36e50d2
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+namespace MediaWiki\Services;
+
+use Exception;
+use RuntimeException;
+
+/**
+ * Exception thrown when the requested service is not known.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * Exception thrown when the requested service is not known.
+ */
+class NoSuchServiceException extends RuntimeException {
+
+       /**
+        * @param string $serviceName
+        * @param Exception|null $previous
+        */
+       public function __construct( $serviceName, Exception $previous = null ) {
+               parent::__construct( "No such service: $serviceName", 0, $previous );
+       }
+
+}
diff --git a/includes/Services/ServiceAlreadyDefinedException.php b/includes/Services/ServiceAlreadyDefinedException.php
new file mode 100644 (file)
index 0000000..c6344d3
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+namespace MediaWiki\Services;
+
+use Exception;
+use RuntimeException;
+
+/**
+ * Exception thrown when a service was already defined, but the
+ * caller expected it to not exist.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * Exception thrown when a service was already defined, but the
+ * caller expected it to not exist.
+ */
+class ServiceAlreadyDefinedException extends RuntimeException {
+
+       /**
+        * @param string $serviceName
+        * @param Exception|null $previous
+        */
+       public function __construct( $serviceName, Exception $previous = null ) {
+               parent::__construct( "Service already defined: $serviceName", 0, $previous );
+       }
+
+}
index e3cda2e..ba3ab32 100644 (file)
@@ -43,7 +43,7 @@ use Wikimedia\Assert\Assert;
  * @see docs/injection.txt for an overview of using dependency injection in the
  *      MediaWiki code base.
  */
-class ServiceContainer {
+class ServiceContainer implements DestructibleService {
 
        /**
         * @var object[]
@@ -60,6 +60,11 @@ class ServiceContainer {
         */
        private $extraInstantiationParams;
 
+       /**
+        * @var boolean
+        */
+       private $destroyed = false;
+
        /**
         * @param array $extraInstantiationParams Any additional parameters to be passed to the
         * instantiator function when creating a service. This is typically used to provide
@@ -69,6 +74,25 @@ class ServiceContainer {
                $this->extraInstantiationParams = $extraInstantiationParams;
        }
 
+       /**
+        * Destroys all contained service instances that implement the DestructibleService
+        * interface. This will render all services obtained from this MediaWikiServices
+        * instance unusable. In particular, this will disable access to the storage backend
+        * via any of these services. Any future call to getService() will throw an exception.
+        *
+        * @see resetGlobalInstance()
+        */
+       public function destroy() {
+               foreach ( $this->getServiceNames() as $name ) {
+                       $service = $this->peekService( $name );
+                       if ( $service !== null && $service instanceof DestructibleService ) {
+                               $service->destroy();
+                       }
+               }
+
+               $this->destroyed = true;
+       }
+
        /**
         * @param array $wiringFiles A list of PHP files to load wiring information from.
         * Each file is loaded using PHP's include mechanism. Each file is expected to
@@ -114,6 +138,28 @@ class ServiceContainer {
                return isset( $this->serviceInstantiators[$name] );
        }
 
+       /**
+        * Returns the service instance for $name only if that service has already been instantiated.
+        * This is intended for situations where services get destroyed/cleaned up, so we can
+        * avoid creating a service just to destroy it again.
+        *
+        * @note Application logic should use getService() instead.
+        *
+        * @see getService().
+        *
+        * @param string $name
+        *
+        * @return object|null The service instance, or null if the service has not yet been instantiated.
+        * @throws RuntimeException if $name does not refer to a known service.
+        */
+       public function peekService( $name ) {
+               if ( !$this->hasService( $name ) ) {
+                       throw new NoSuchServiceException( $name );
+               }
+
+               return isset( $this->services[$name] ) ? $this->services[$name] : null;
+       }
+
        /**
         * @return string[]
         */
@@ -139,7 +185,7 @@ class ServiceContainer {
                Assert::parameterType( 'string', $name, '$name' );
 
                if ( $this->hasService( $name ) ) {
-                       throw new RuntimeException( 'Service already defined: ' . $name );
+                       throw new ServiceAlreadyDefinedException( $name );
                }
 
                $this->serviceInstantiators[$name] = $instantiator;
@@ -165,16 +211,78 @@ class ServiceContainer {
                Assert::parameterType( 'string', $name, '$name' );
 
                if ( !$this->hasService( $name ) ) {
-                       throw new RuntimeException( 'Service not defined: ' . $name );
+                       throw new NoSuchServiceException( $name );
                }
 
                if ( isset( $this->services[$name] ) ) {
-                       throw new RuntimeException( 'Cannot redefine a service that is already in use: ' . $name );
+                       throw new CannotReplaceActiveServiceException( $name );
                }
 
                $this->serviceInstantiators[$name] = $instantiator;
        }
 
+       /**
+        * Disables a service.
+        *
+        * @note Attempts to call getService() for a disabled service will result
+        * in a DisabledServiceException. Calling peekService for a disabled service will
+        * return null. Disabled services are listed by getServiceNames(). A disabled service
+        * can be enabled again using redefineService().
+        *
+        * @note If the service was already active (that is, instantiated) when getting disabled,
+        * and the service instance implements DestructibleService, destroy() is called on the
+        * service instance.
+        *
+        * @see redefineService()
+        * @see resetService()
+        *
+        * @param string $name The name of the service to disable.
+        *
+        * @throws RuntimeException if $name is not a known service.
+        */
+       public function disableService( $name ) {
+               $this->resetService( $name );
+
+               $this->redefineService( $name, function() use ( $name ) {
+                       throw new ServiceDisabledException( $name );
+               } );
+       }
+
+       /**
+        * Resets a service by dropping the service instance.
+        * If the service instances implements DestructibleService, destroy()
+        * is called on the service instance.
+        *
+        * @warning This is generally unsafe! Other services may still retain references
+        * to the stale service instance, leading to failures and inconsistencies. Subclasses
+        * may use this method to reset specific services under specific instances, but
+        * it should not be exposed to application logic.
+        *
+        * @note This is declared final so subclasses can not interfere with the expectations
+        * disableService() has when calling resetService().
+        *
+        * @see redefineService()
+        * @see disableService().
+        *
+        * @param string $name The name of the service to reset.
+        * @param bool $destroy Whether the service instance should be destroyed if it exists.
+        *        When set to false, any existing service instance will effectively be detached
+        *        from the container.
+        *
+        * @throws RuntimeException if $name is not a known service.
+        */
+       final protected function resetService( $name, $destroy = true ) {
+               Assert::parameterType( 'string', $name, '$name' );
+
+               $instance = $this->peekService( $name );
+
+               if ( $destroy && $instance instanceof DestructibleService )  {
+                       $instance->destroy();
+               }
+
+               unset( $this->services[$name] );
+       }
+
        /**
         * Returns a service object of the kind associated with $name.
         * Services instances are instantiated lazily, on demand.
@@ -189,10 +297,16 @@ class ServiceContainer {
         *
         * @param string $name The service name
         *
-        * @throws InvalidArgumentException if $name is not a known service.
+        * @throws NoSuchServiceException if $name is not a known service.
+        * @throws ServiceDisabledException if this container has already been destroyed.
+        *
         * @return object The service instance
         */
        public function getService( $name ) {
+               if ( $this->destroyed ) {
+                       throw new ContainerDisabledException();
+               }
+
                if ( !isset( $this->services[$name] ) ) {
                        $this->services[$name] = $this->createService( $name );
                }
@@ -213,7 +327,7 @@ class ServiceContainer {
                                array_merge( [ $this ], $this->extraInstantiationParams )
                        );
                } else {
-                       throw new InvalidArgumentException( 'Unknown service: ' . $name );
+                       throw new NoSuchServiceException( $name );
                }
 
                return $service;
diff --git a/includes/Services/ServiceDisabledException.php b/includes/Services/ServiceDisabledException.php
new file mode 100644 (file)
index 0000000..ae15b7c
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+namespace MediaWiki\Services;
+
+use Exception;
+use RuntimeException;
+
+/**
+ * Exception thrown when trying to access a disabled service.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ *
+ * @since 1.27
+ */
+
+/**
+ * Exception thrown when trying to access a disabled service.
+ */
+class ServiceDisabledException extends RuntimeException {
+
+       /**
+        * @param string $serviceName
+        * @param Exception|null $previous
+        */
+       public function __construct( $serviceName, Exception $previous = null ) {
+               parent::__construct( "Service disabled: $serviceName", 0, $previous );
+       }
+
+}
index d7f1189..c8910f4 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This file is not a valid entry point, perform no further processing unless
@@ -522,6 +523,14 @@ if ( !class_exists( 'AutoLoader' ) ) {
        require_once "$IP/includes/AutoLoader.php";
 }
 
+// Reset the global service locator, so any services that have already been created will be
+// re-created while taking into account any custom settings and extensions.
+MediaWikiServices::resetGlobalInstance( new GlobalVarConfig() );
+
+// Define a constant that indicates that the bootstrapping of the service locator
+// is complete.
+define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
+
 // Install a header callback to prevent caching of responses with cookies (T127993)
 if ( !$wgCommandLineMode ) {
        header_register_callback( function () {
@@ -679,7 +688,7 @@ if ( $wgCommandLineMode ) {
 Profiler::instance()->scopedProfileOut( $ps_misc );
 $ps_memcached = Profiler::instance()->scopedProfileIn( $fname . '-memcached' );
 
-$wgMemc = wfGetMainCache();
+$wgMemc = ObjectCache::getLocalClusterInstance();
 $messageMemc = wfGetMessageCacheStorage();
 $parserMemc = wfGetParserCacheStorage();
 
index 8ae7932..603bacd 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 
 /**
@@ -49,11 +50,6 @@ class WatchedItemStore implements StatsdAwareInterface {
         */
        private $stats;
 
-       /**
-        * @var self|null
-        */
-       private static $instance;
-
        /**
         * @param LoadBalancer $loadBalancer
         * @param HashBagOStuff $cache
@@ -125,43 +121,11 @@ class WatchedItemStore implements StatsdAwareInterface {
        }
 
        /**
-        * Overrides the default instance of this class
-        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
-        *
-        * If this method is used it MUST also be called with null after a test to ensure a new
-        * default instance is created next time getDefaultInstance is called.
-        *
-        * @param WatchedItemStore|null $store
-        *
-        * @return ScopedCallback to reset the overridden value
-        * @throws MWException
-        */
-       public static function overrideDefaultInstance( WatchedItemStore $store = null ) {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       throw new MWException(
-                               'Cannot override ' . __CLASS__ . 'default instance in operation.'
-                       );
-               }
-
-               $previousValue = self::$instance;
-               self::$instance = $store;
-               return new ScopedCallback( function() use ( $previousValue ) {
-                       self::$instance = $previousValue;
-               } );
-       }
-
-       /**
+        * @deprecated use MediaWikiServices::getInstance()->getWatchedItemStore()
         * @return self
         */
        public static function getDefaultInstance() {
-               if ( !self::$instance ) {
-                       self::$instance = new self(
-                               wfGetLB(),
-                               new HashBagOStuff( [ 'maxKeys' => 100 ] )
-                       );
-                       self::$instance->setStatsdDataFactory( RequestContext::getMain()->getStats() );
-               }
-               return self::$instance;
+               return MediaWikiServices::getInstance()->getWatchedItemStore();
        }
 
        private function getCacheKey( User $user, LinkTarget $target ) {
index bbb8656..40d12f4 100644 (file)
        "apihelp-parse-example-summary": "Analizar un resumen.",
        "apihelp-patrol-description": "Verificar una página o revisión.",
        "apihelp-patrol-param-rcid": "Identificador de cambios recientes que verificar.",
-       "apihelp-patrol-param-revid": "ID de revisión a patrullar.",
+       "apihelp-patrol-param-revid": "Identificador de revisión que patrullar.",
        "apihelp-patrol-example-rcid": "Verificar un cambio reciente.",
        "apihelp-patrol-example-revid": "Verificar una revisión.",
        "apihelp-protect-description": "Cambiar el nivel de protección de una página.",
index 8ac4d51..76fd47d 100644 (file)
@@ -56,7 +56,7 @@
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
        "apihelp-imagerotate-description": "Eent oder méi Biller dréinen.",
        "apihelp-imagerotate-example-generator": "All Biller an der <kbd>Category:Flip]]<kbd> ëm <kbd>180<kbd> Grad dréinen.",
-       "apihelp-import-param-summary": "Resumé importéieren.",
+       "apihelp-import-param-summary": "Resumé vum importéiere vum Logbuch.",
        "apihelp-import-param-xml": "Eropgeluedenen XML-Fichier.",
        "apihelp-import-param-rootpage": "Als Ënnersäit vun dëser Säit importéieren. Kann net zesumme mam <var>$1namespace</var> benotzt ginn.",
        "apihelp-login-param-name": "Benotzernumm.",
index 4b803d8..09b0baa 100644 (file)
@@ -51,16 +51,39 @@ class ConfigFactory {
        }
 
        /**
-        * Register a new config factory function
-        * Will override if it's already registered
+        * @return string[]
+        */
+       public function getConfigNames() {
+               return array_keys( $this->factoryFunctions );
+       }
+
+       /**
+        * Register a new config factory function.
+        * Will override if it's already registered.
+        * Use "*" for $name to provide a fallback config for all unknown names.
         * @param string $name
-        * @param callable $callback That takes this ConfigFactory as an argument
+        * @param callable|Config $callback A factory callabck that takes this ConfigFactory
+        *        as an argument and returns a Config instance, or an existing Config instance.
         * @throws InvalidArgumentException If an invalid callback is provided
         */
        public function register( $name, $callback ) {
+               if ( $callback instanceof Config ) {
+                       $instance = $callback;
+
+                       // Register a callback anyway, for consistency. Note that getConfigNames()
+                       // relies on $factoryFunctions to have all config names.
+                       $callback = function() use ( $instance ) {
+                               return $instance;
+                       };
+               } else {
+                       $instance = null;
+               }
+
                if ( !is_callable( $callback ) ) {
                        throw new InvalidArgumentException( 'Invalid callback provided' );
                }
+
+               $this->configs[$name] = $instance;
                $this->factoryFunctions[$name] = $callback;
        }
 
@@ -75,10 +98,14 @@ class ConfigFactory {
         */
        public function makeConfig( $name ) {
                if ( !isset( $this->configs[$name] ) ) {
-                       if ( !isset( $this->factoryFunctions[$name] ) ) {
+                       $key = $name;
+                       if ( !isset( $this->factoryFunctions[$key] ) ) {
+                               $key = '*';
+                       }
+                       if ( !isset( $this->factoryFunctions[$key] ) ) {
                                throw new ConfigException( "No registered builder available for $name." );
                        }
-                       $conf = call_user_func( $this->factoryFunctions[$name], $this );
+                       $conf = call_user_func( $this->factoryFunctions[$key], $this );
                        if ( $conf instanceof Config ) {
                                $this->configs[$name] = $conf;
                        } else {
@@ -88,4 +115,5 @@ class ConfigFactory {
 
                return $this->configs[$name];
        }
+
 }
index c8b8108..ba54603 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Group all the pieces relevant to the context of a request into one instance
@@ -496,9 +497,8 @@ class RequestContext implements IContextSource, MutableContext {
         * Resets singleton returned by getMain(). Should be called only from unit tests.
         */
        public static function resetMain() {
-               if ( !( defined( 'MW_PHPUNIT_TEST' ) || defined( 'MW_PARSER_TEST' ) ) ) {
-                       throw new MWException( __METHOD__ . '() should be called only from unit tests!' );
-               }
+               // TODO: manage service instances in MediaWikiServices
+               MediaWikiServices::failUnlessBootstrapping( __METHOD__ );
                self::$instance = null;
        }
 
index a484bb4..549a8b5 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Database
  */
 
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Services\DestructibleService;
 use Psr\Log\LoggerInterface;
 use MediaWiki\Logger\LoggerFactory;
 
@@ -28,7 +30,8 @@ use MediaWiki\Logger\LoggerFactory;
  * An interface for generating database load balancers
  * @ingroup Database
  */
-abstract class LBFactory {
+abstract class LBFactory implements DestructibleService {
+
        /** @var ChronologyProtector */
        protected $chronProt;
 
@@ -38,9 +41,6 @@ abstract class LBFactory {
        /** @var LoggerInterface */
        protected $logger;
 
-       /** @var LBFactory */
-       private static $instance;
-
        /** @var string|bool Reason all LBs are read-only or false if not */
        protected $readOnlyReason = false;
 
@@ -60,38 +60,40 @@ abstract class LBFactory {
                $this->logger = LoggerFactory::getInstance( 'DBTransaction' );
        }
 
+       /**
+        * Disables all load balancers. All connections are closed, and any attempt to
+        * open a new connection will result in a DBAccessError.
+        * @see LoadBalancer::disable()
+        */
+       public function destroy() {
+               $this->shutdown();
+               $this->forEachLBCallMethod( 'disable' );
+       }
+
        /**
         * Disables all access to the load balancer, will cause all database access
         * to throw a DBAccessError
         */
        public static function disableBackend() {
-               global $wgLBFactoryConf;
-               self::$instance = new LBFactoryFake( $wgLBFactoryConf );
+               MediaWikiServices::disableStorageBackend();
        }
 
        /**
         * Get an LBFactory instance
         *
+        * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead.
+        *
         * @return LBFactory
         */
        public static function singleton() {
-               global $wgLBFactoryConf;
-
-               if ( is_null( self::$instance ) ) {
-                       $class = self::getLBFactoryClass( $wgLBFactoryConf );
-                       $config = $wgLBFactoryConf;
-                       if ( !isset( $config['readOnlyReason'] ) ) {
-                               $config['readOnlyReason'] = wfConfiguredReadOnlyReason();
-                       }
-                       self::$instance = new $class( $config );
-               }
-
-               return self::$instance;
+               return MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
        }
 
        /**
         * Returns the LBFactory class to use and the load balancer configuration.
         *
+        * @todo instead of this, use a ServiceContainer for managing the different implementations.
+        *
         * @param array $config (e.g. $wgLBFactoryConf)
         * @return string Class name
         */
@@ -118,27 +120,6 @@ abstract class LBFactory {
                return $class;
        }
 
-       /**
-        * Shut down, close connections and destroy the cached instance.
-        */
-       public static function destroyInstance() {
-               if ( self::$instance ) {
-                       self::$instance->shutdown();
-                       self::$instance->forEachLBCallMethod( 'closeAll' );
-                       self::$instance = null;
-               }
-       }
-
-       /**
-        * Set the instance to be the given object
-        *
-        * @param LBFactory $instance
-        */
-       public static function setInstance( $instance ) {
-               self::destroyInstance();
-               self::$instance = $instance;
-       }
-
        /**
         * Create a new load balancer object. The resulting object will be untracked,
         * not chronology-protected, and the caller is responsible for cleaning it up.
@@ -473,8 +454,7 @@ abstract class LBFactory {
  */
 class DBAccessError extends MWException {
        public function __construct() {
-               parent::__construct( "Mediawiki tried to access the database via wfGetDB(). " .
-                       "This is not allowed." );
+               parent::__construct( 'The storage backend is disabled!' );
        }
 }
 
index 741999c..5578099 100644 (file)
@@ -77,6 +77,11 @@ class LoadBalancer {
        /** @var integer Max time to wait for a slave to catch up (e.g. ChronologyProtector) */
        const POS_WAIT_TIMEOUT = 10;
 
+       /**
+        * @var boolean
+        */
+       private $disabled = false;
+
        /**
         * @param array $params Array with keys:
         *  - servers : Required. Array of server info structures.
@@ -666,6 +671,8 @@ class LoadBalancer {
         * On error, returns false, and the connection which caused the
         * error will be available via $this->mErrorConnection.
         *
+        * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
+        *
         * @param int $i Server index
         * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @return DatabaseBase|bool Returns false on errors
@@ -716,6 +723,8 @@ class LoadBalancer {
         * On error, returns false, and the connection which caused the
         * error will be available via $this->mErrorConnection.
         *
+        * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError.
+        *
         * @param int $i Server index
         * @param string $wiki Wiki ID to open
         * @return DatabaseBase
@@ -803,6 +812,10 @@ class LoadBalancer {
         * @return DatabaseBase
         */
        protected function reallyOpenConnection( $server, $dbNameOverride = false ) {
+               if ( $this->disabled ) {
+                       throw new DBAccessError();
+               }
+
                if ( !is_array( $server ) ) {
                        throw new MWException( 'You must update your load-balancing configuration. ' .
                                'See DefaultSettings.php entry for $wgDBservers.' );
@@ -976,6 +989,17 @@ class LoadBalancer {
                return false;
        }
 
+       /**
+        * Disable this load balancer. All connections are closed, and any attempt to
+        * open a new connection will result in a DBAccessError.
+        *
+        * @since 1.27
+        */
+       public function disable() {
+               $this->closeAll();
+               $this->disabled = true;
+       }
+
        /**
         * Close all open connections
         */
index 79bd961..701403e 100644 (file)
@@ -287,8 +287,16 @@ abstract class DatabaseInstaller {
                if ( !$status->isOK() ) {
                        throw new MWException( __METHOD__ . ': unexpected DB connection error' );
                }
-               LBFactory::setInstance( new LBFactorySingle( [
-                       'connection' => $status->value ] ) );
+
+               \MediaWiki\MediaWikiServices::resetGlobalInstance();
+               $services = \MediaWiki\MediaWikiServices::getInstance();
+
+               $connection = $status->value;
+               $services->redefineService( 'DBLoadBalancerFactory', function() use ( $connection ) {
+                       return new LBFactorySingle( [
+                               'connection' => $connection ] );
+               } );
+
        }
 
        /**
index 3d1c860..97214da 100644 (file)
@@ -351,37 +351,67 @@ abstract class Installer {
         */
        abstract public function showStatusMessage( Status $status );
 
+       /**
+        * Constructs a Config object that contains configuration settings that should be
+        * overwritten for the installation process.
+        *
+        * @since 1.27
+        *
+        * @param Config $baseConfig
+        *
+        * @return Config The config to use during installation.
+        */
+       public static function getInstallerConfig( Config $baseConfig ) {
+               $configOverrides = new HashConfig();
+
+               // disable (problematic) object cache types explicitly, preserving all other (working) ones
+               // bug T113843
+               $emptyCache = [ 'class' => 'EmptyBagOStuff' ];
+
+               $objectCaches = [
+                               CACHE_NONE => $emptyCache,
+                               CACHE_DB => $emptyCache,
+                               CACHE_ANYTHING => $emptyCache,
+                               CACHE_MEMCACHED => $emptyCache,
+                       ] + $baseConfig->get( 'ObjectCaches' );
+
+               $configOverrides->set( 'ObjectCaches', $objectCaches );
+
+               // Load the installer's i18n.
+               $messageDirs = $baseConfig->get( 'MessagesDirs' );
+               $messageDirs['MediawikiInstaller'] = __DIR__ . '/i18n';
+
+               $configOverrides->set( 'MessagesDirs', $messageDirs );
+
+               return new MultiConfig( [ $configOverrides, $baseConfig ] );
+       }
+
        /**
         * Constructor, always call this from child classes.
         */
        public function __construct() {
-               global $wgMessagesDirs, $wgUser;
+               global $wgMemc, $wgUser;
+
+               $defaultConfig = new GlobalVarConfig(); // all the stuff from DefaultSettings.php
+               $installerConfig = self::getInstallerConfig( $defaultConfig );
+
+               // Reset all services and inject config overrides
+               MediaWiki\MediaWikiServices::resetGlobalInstance( $installerConfig );
 
                // Don't attempt to load user language options (T126177)
                // This will be overridden in the web installer with the user-specified language
                RequestContext::getMain()->setLanguage( 'en' );
 
                // Disable the i18n cache
+               // TODO: manage LocalisationCache singleton in MediaWikiServices
                Language::getLocalisationCache()->disableBackend();
-               // Disable LoadBalancer and wfGetDB etc.
-               LBFactory::disableBackend();
+
+               // Disable all global services, since we don't have any configuration yet!
+               MediaWiki\MediaWikiServices::disableStorageBackend();
 
                // Disable object cache (otherwise CACHE_ANYTHING will try CACHE_DB and
                // SqlBagOStuff will then throw since we just disabled wfGetDB)
-               $GLOBALS['wgMemc'] = new EmptyBagOStuff;
-               ObjectCache::clear();
-               $emptyCache = [ 'class' => 'EmptyBagOStuff' ];
-               // disable (problematic) object cache types explicitly, preserving all other (working) ones
-               // bug T113843
-               $GLOBALS['wgObjectCaches'] = [
-                       CACHE_NONE => $emptyCache,
-                       CACHE_DB => $emptyCache,
-                       CACHE_ANYTHING => $emptyCache,
-                       CACHE_MEMCACHED => $emptyCache,
-               ] + $GLOBALS['wgObjectCaches'];
-
-               // Load the installer's i18n.
-               $wgMessagesDirs['MediawikiInstaller'] = __DIR__ . '/i18n';
+               $wgMemc = ObjectCache::getInstance( CACHE_NONE );
 
                // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
                $wgUser = User::newFromId( 0 );
index 1c9fe79..6bc3fd9 100644 (file)
        "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
        "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\n{{PLURAL:$2|נתמך הסוג הבא של מסד נתונים|נתמכים הסוגים הבאים של מסדי נתונים}}: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
        "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
-       "config-no-fts3": "'''×\90×\96×\94ר×\94''': SQLite ×\9eק×\95×\9eפ×\9c ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
+       "config-no-fts3": "'''×\90×\96×\94ר×\94''': SQLite ×\9e×\94×\95×\93ר ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
        "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.",
        "config-xml-bad": "מודול XML של PHP חסר.\nמדיה־ויקי דורשת פונקציות של המודול ולא תעבוד עם הגדרות כאלו.\nייתכן שצריך להתקין באמצעות RPM את חבילת php-xml.",
        "config-pcre-old": "<strong>שגיאה סופנית:</strong> חובה להתקין PCRE מגרסה $1 או גרסה חדשה יותר.\nקובץ הרצת ה־PHP שלך מקושר עם PCRE מגרסה $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE מידע נוסף].",
-       "config-pcre-no-utf8": "'''שגיאה סופנית''': נראה שמודול PCRE של PHP מקומפל ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
+       "config-pcre-no-utf8": "<strong>שגיאה סופנית</strong>: נראה שמודול PCRE של PHP מהודר ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
        "config-memory-raised": "ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.",
        "config-memory-bad": "'''אזהרה:''' ערך האפשרות <code>memory_limit</code> של PHP הוא $1.\nזה כנראה נמוך מדי.\nההתקנה עשויה להיכשל!",
        "config-ctype": "<strong>שגיאה סופנית</strong>: נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].",
-       "config-iconv": "<strong>ס×\95פנ×\99:</strong> ×\97×\95×\91×\94 ×\9cק×\9eפ×\9c את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/iconv.installation.php iconv].",
+       "config-iconv": "<strong>ס×\95פנ×\99:</strong> ×\97×\95×\91×\94 ×\9c×\94×\93ר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/iconv.installation.php iconv].",
        "config-json": "'''שגיאה סופנית:''' PHP קומפל ללא תמיכה ב־JSON.\nיש להתקין את ההרחהב JSON ב־PHP או את ההרחבה [http://pecl.php.net/package/jsonc PECL jsonc] לפני התקנת מדיה־ויקי.\n* ההרחבה ל־PHP כלולה ב־Red Hat Enterprise Linux (ו־CentOS), אך יש להפעיל אותה ב־<code dir=\"ltr\">/etc/php.ini</code> או ב־<code dir=\"ltr\">/etc/php.d/json.ini</code>.",
+       "config-mbstring-absent": "<strong>סופני:</strong> חובה להדר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/mbstring.setup.php mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] מותקן",
        "config-apc": "[http://www.php.net/apc APC] מותקן",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן",
-       "config-no-cache": "'''אזהרה:''' אחת מהתוכנות הבאות לא נמצאה: [http://www.php.net/apc APC]&rlm;, [http://xcache.lighttpd.net/ XCache] או [http://www.iis.net/download/WinCacheForPhp WinCache].\nמטמון עצמים לא מופעל.",
        "config-no-cache-apcu": "<strong>אזהרה:</strong> לא נמצא [http://www.php.net/apcu APCu]‏, [http://xcache.lighttpd.net/ XCache] או [http://www.iis.net/download/WinCacheForPhp WinCache].\nמטמון עצמים לא מופעל.",
        "config-mod-security": "'''אזהרה''': בשרת הווב שלך מופעל [http://modsecurity.org/ mod_security]. אם הוא לא מוגדר טוב, זה יכול לגרום לבעיות במדיה־ויקי ובתכנה אחרת שמאפשרת למשתמשים לשלוח תוכן שרירותי.\nיש לקרוא את [http://modsecurity.org/documentation/ התיעוד של mod_security] או ליצור קשר עם אנשי התמיכה של שירותי האירוח שלכם אם מופיעות לך שגיאות אקראיות.",
        "config-diff3-bad": "GNU diff3 לא נמצא.",
        "config-ns-site-name": "זהה לשם הוויקי: $1",
        "config-ns-other": "אחר (לציין)",
        "config-ns-other-default": "הוויקי שלי",
-       "config-project-namespace-help": "בהתאם לדוגמה של ויקיפדיה, אתרי ויקי רבים שומרים על דפי המדיניות שלהם בנפרד מדפי התוכן שלהם ב\"'''מרחב השמות של המיזם'''\" (\"'''project namespace'''\").\nכל שמות הדפים במרחב השמות הזה מתחילים בתחילית מסוימת שאפשר להגדיר כאן.\nבדרך כלל התחילית הזאת מבוססת על שם הוויקי, והיא אינה יכולה להכיל תווי פיסוק כגון \"#\" או \":\".",
+       "config-project-namespace-help": "בהתאם לדוגמה של ויקיפדיה, אתרי ויקי רבים שומרים על דפי המדיניות שלהם בנפרד מדפי התוכן שלהם ב'''מרחב השמות של המיזם''' (באנגלית: '''project namespace''').\nכל שמות הדפים במרחב השמות הזה מתחילים בתחילית מסוימת שאפשר להגדיר כאן.\nבדרך כלל התחילית הזאת מבוססת על שם הוויקי, והיא אינה יכולה להכיל תווי פיסוק כגון \"#\" או \":\".",
        "config-ns-invalid": "מרחב השמות \"<nowiki>$1</nowiki>\" אינו תקין.\nיש להקליד שם אחר למרחב השמות של המיזם.",
        "config-ns-conflict": "מרחב השמות שהגדרת \"<nowiki>$1</nowiki>\" מתנגש עם מרחב שמות מובנה של מדיה־ויקי.\nהגדירו מרחב שמות מיזם שונה.",
        "config-admin-box": "חשבון מפעיל",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
-       "config-install-done": "'''מזל טוב!'''\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n'''שימו לב''': אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו '''[$2 להיכנס לוויקי שלכם]'''.",
+       "config-install-done": "</strong>מזל טוב!</strong>\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n</strong>שימו לב</strong>: אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו </strong>[$2 להיכנס לוויקי שלכם]</strong>.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
        "config-help-tooltip": "להרחיב",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
-       "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
+       "mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
        "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index 9b45830..e0affaf 100644 (file)
@@ -15,7 +15,8 @@
                        "Imperadeiro98",
                        "Cainamarques",
                        "Vitorvicentevalente",
-                       "Macofe"
+                       "Macofe",
+                       "Diniscoelho"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
        "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
        "mainpagetext": "<strong>MediaWiki instalado.</strong>",
-       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda a combater o spam na sua wiki]"
+       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize o MediaWiki para seu idioma]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda a combater spam na sua wiki]"
 }
index b54c65a..3ab0c80 100644 (file)
        "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databas{{PLURAL:$2|typ |typer}} stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
        "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
        "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
-       "config-register-globals-error": "<strong>Fel: PHP-alternativet <code>[http://php.net/register_globals register_globals]</code> är aktiverad.\nDen måste vara inaktiverad för att fortsätta med installationen.</strong>\nSe [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] för hjälp om hur man gör så.",
-       "config-magic-quotes-gpc": "<strong>Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_gpc är aktiv!</strong>\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
-       "config-magic-quotes-runtime": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
-       "config-magic-quotes-sybase": "'''Kritiskt: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] är aktiv!'''\nDetta alternativ korrumperar inmatad data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
-       "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
        "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nDu kan behöva installera RPM-paketet för php-xml.",
        "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-ctype": "'''Kritiskt:''' PHP måste kompileras med stöd för [http://www.php.net/manual/en/ctype.installation.php Ctype-tillägget].",
        "config-iconv": "<strong>Kritiskt:</strong> PHP måste kompileras med stöd för [http://www.php.net/manual/en/iconv.installation.php iconv-tillägget].",
        "config-json": "'''Varning:''' PHP kompilerades utan JSON-stöd.\nDu måste antingen installera PHP JSON-tillägget eller [http://pecl.php.net/package/jsonc PECL jsonc]-tillägget före installationen av MediaWiki.\n* PHP-tillägget är inkluderat i Red Hat Enterprise Linux (CentOS) 5 och 6, men måste aktiveras i <code>/etc/php.ini</code> eller <code>/etc/php.d/json.ini</code>.\n* Vissa Linux-distributioner släppta efter maj 2013 har utelämnat PHP-tillägget och har istället inkluderat PECL-tillägget som <code>php5-json</code> eller <code>php-pecl-jsonc</code>.",
+       "config-mbstring-absent": "'''Kritiskt:''' PHP måste kompileras med stöd för tillägget [http://www.php.net/manual/en/mbstring.setup.php mbstring mbstring].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerat",
        "config-apc": "[http://www.php.net/apc APC] är installerat",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] är installerat",
-       "config-no-cache": "'''Varning:''' Kunde inte hitta [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
        "config-no-cache-apcu": "'''Varning:''' Kunde inte hitta [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.",
        "config-mod-security": "'''Varning:''' Din webbserver har [http://modsecurity.org/ mod_security] aktiverat. Om felaktigt konfigurerat kan den skapa problem för MediaWiki eller annan programvara som tillåter användaren att posta godtyckligt innehåll.\nTitta på [http://modsecurity.org/documentation/ mod_security-dokumentationen] eller kontakta din värd om du påträffar slumpmässiga fel.",
        "config-diff3-bad": "GNU diff3 hittades inte.",
        "config-ns-site-name": "Samma som wikinamnet: $1",
        "config-ns-other": "Annan (specificera)",
        "config-ns-other-default": "MinWiki",
-       "config-project-namespace-help": "Per Wikipedias exempel håller många wikis sina policy-sidor separata från innehållssidorna i en \"'''projektnamnrymd'''\".\nAlla sidtitlar i denna namnrymd startar med ett visst prefix vilket du specificerar här.\nVanligtvis kan detta namn härledas från namnet på wikin, men den får inte innehålla interpunktionstecken som exempelvis \"#\" eller \":\".",
+       "config-project-namespace-help": "Per Wikipedias exempel håller många wikis sina policy-sidor separata från innehållssidorna i en '''projektnamnrymd'''.\nAlla sidtitlar i denna namnrymd startar med ett visst prefix vilket du specificerar här.\nVanligtvis kan detta namn härledas från namnet på wikin, men den får inte innehålla interpunktionstecken som exempelvis \"#\" eller \":\".",
        "config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge en annan namnrymd för projektet.",
        "config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge en annan namnrymd för projektet.",
        "config-admin-box": "Administratörskonto",
        "config-install-mainpage": "Skapa huvudsida med standardinnehåll",
        "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg",
        "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
-       "config-install-done": "'''Grattis!'''\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n'''OBS''': Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du '''[$2 gå in på din wiki]'''.",
+       "config-install-done": "<strong>Grattis!</strong>\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n<strong>OBS</strong>: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du <strong>[$2 gå in på din wiki]</strong>",
        "config-download-localsettings": "Ladda ner <code>LocalSettings.php</code>",
        "config-help": "hjälp",
        "config-help-tooltip": "klicka för att expandera",
        "config-nofile": "Filen \"$1\" kunde inte hittas. Har den raderats?",
        "config-extension-link": "Visste du att din wiki stödjer [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions tillägg]?\n\nDu kan bläddra [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category tillägg efter kategori].",
-       "mainpagetext": "'''MediaWiki har installerats utan problem.'''",
+       "mainpagetext": "<strong>MediaWiki har installerats utan problem.</strong>",
        "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Läs om hur du bekämpar spam på din wiki]"
 }
index b9dfb6c..1fd4b7f 100644 (file)
@@ -33,12 +33,19 @@ class RightsLogFormatter extends LogFormatter {
                global $wgContLang, $wgUserrightsInterwikiDelimiter;
 
                if ( !$this->plaintext ) {
-                       $text = $wgContLang->ucfirst( $title->getText() );
+                       $text = $wgContLang->ucfirst( $title->getDBkey() );
                        $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
 
                        if ( count( $parts ) === 2 ) {
-                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                       htmlspecialchars( $title->getText() ) );
+                               $titleLink = WikiMap::foreignUserLink(
+                                       $parts[1],
+                                       $parts[0],
+                                       htmlspecialchars(
+                                               strtr( $parts[0], '_', ' ' ) .
+                                               $wgUserrightsInterwikiDelimiter .
+                                               $parts[1]
+                                       )
+                               );
 
                                if ( $titleLink !== false ) {
                                        return $titleLink;
index 11178f4..95fa859 100644 (file)
@@ -174,8 +174,8 @@ class Exif {
                                # Tags relating to image configuration
                                'ComponentsConfiguration' => Exif::UNDEFINED, # Meaning of each component #p33
                                'CompressedBitsPerPixel' => Exif::RATIONAL, # Image compression mode
-                               'PixelYDimension' => Exif::SHORT_OR_LONG, # Valid image width
-                               'PixelXDimension' => Exif::SHORT_OR_LONG, # Valid image height
+                               'PixelYDimension' => Exif::SHORT_OR_LONG, # Valid image height
+                               'PixelXDimension' => Exif::SHORT_OR_LONG, # Valid image width
 
                                # Tags relating to related user information
                                'MakerNote' => Exif::IGNORE, # Manufacturer notes
index fc73335..2820712 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace MediaWiki\Session;
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
 use BagOStuff;
 use CachedBagOStuff;
@@ -1090,11 +1091,7 @@ final class SessionManager implements SessionManagerInterface {
         * Reset the internal caching for unit testing
         */
        public static function resetCache() {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       // @codeCoverageIgnoreStart
-                       throw new MWException( __METHOD__ . ' may only be called from unit tests!' );
-                       // @codeCoverageIgnoreEnd
-               }
+               MediaWikiServices::failUnlessBootstrapping( __METHOD__ );
 
                self::$globalSession = null;
                self::$globalSessionRequest = null;
index a4116ae..bb64510 100644 (file)
@@ -23,6 +23,8 @@
  * @file
  * @ingroup Site
  *
+ * @deprecated 1.27 use DBSiteStore and CachingSiteStore instead.
+ *
  * @license GNU GPL v2+
  * @author Daniel Kinzler
  */
index f67a8d8..616ae93 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * The CentralIdLookup service allows for connecting local users with
@@ -68,9 +69,8 @@ abstract class CentralIdLookup implements IDBAccessObject {
         * Reset internal cache for unit testing
         */
        public static function resetCache() {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       throw new MWException( __METHOD__ . ' may only be called from unit tests!' );
-               }
+               // TODO: manage service instances in MediaWikiServices
+               MediaWikiServices::failUnlessBootstrapping( __METHOD__ );
                self::$instances = [];
        }
 
index e5bb082..04eba97 100644 (file)
@@ -2694,14 +2694,36 @@ class User implements IDBAccessObject {
                        return Status::newGood( true );
                }
 
+               $type = $oldaddr != '' ? 'changed' : 'set';
+               $notificationResult = null;
+
+               if ( $wgEmailAuthentication ) {
+                       // Send the user an email notifying the user of the change in registered
+                       // email address on their previous email address
+                       if ( $type == 'changed' ) {
+                               $change = $str != '' ? 'changed' : 'removed';
+                               $notificationResult = $this->sendMail(
+                                       wfMessage( 'notificationemail_subject_' . $change )->text(),
+                                       wfMessage( 'notificationemail_body_' . $change,
+                                               $this->getRequest()->getIP(),
+                                               $this->getName(),
+                                               $str )->text()
+                               );
+                       }
+               }
+
                $this->setEmail( $str );
 
                if ( $str !== '' && $wgEmailAuthentication ) {
                        // Send a confirmation request to the new address if needed
-                       $type = $oldaddr != '' ? 'changed' : 'set';
                        $result = $this->sendConfirmationMail( $type );
+
+                       if ( $notificationResult !== null ) {
+                               $result->merge( $notificationResult );
+                       }
+
                        if ( $result->isGood() ) {
-                               // Say to the caller that a confirmation mail has been sent
+                               // Say to the caller that a confirmation and notification mail has been sent
                                $result->value = 'eauth';
                        }
                } else {
index e03ef78..5e43c8b 100644 (file)
        "exif-colorspace": "Kleurruimte",
        "exif-componentsconfiguration": "Betekenis van elke komponent",
        "exif-compressedbitsperpixel": "Beeldkompressiemetode",
-       "exif-pixelydimension": "Beeldwydte",
-       "exif-pixelxdimension": "Beeldhoogte",
+       "exif-pixelxdimension": "Beeldwydte",
+       "exif-pixelydimension": "Beeldhoogte",
        "exif-usercomment": "Opmerkings",
        "exif-relatedsoundfile": "Verwante klanklêer",
        "exif-datetimeoriginal": "Gegewens opgestel op",
index 4971ff7..1977fdf 100644 (file)
        "exif-flashpixversion": "የተደገፈ Flashpix ዝርያ",
        "exif-componentsconfiguration": "የየክፍለ ነገሩ ትርጉም",
        "exif-compressedbitsperpixel": "የስዕል መጨመቅ ዘዴ",
-       "exif-pixelydimension": "እውነተኛ የስዕል ስፋት",
-       "exif-pixelxdimension": "እውነተኛ የስዕል ቁመት",
+       "exif-pixelxdimension": "እውነተኛ የስዕል ስፋት",
+       "exif-pixelydimension": "እውነተኛ የስዕል ቁመት",
        "exif-usercomment": "የተጠቃሚው ማጠቃለያ",
        "exif-relatedsoundfile": "የተዛመደ የድምጽ ፋይል",
        "exif-datetimeoriginal": "መረጃው የተፈጠረበት ቀንና ሰዓት",
index 516a780..27e56ab 100644 (file)
        "exif-colorspace": "Espacio de colors",
        "exif-componentsconfiguration": "Significación de cada component",
        "exif-compressedbitsperpixel": "Modo de compresión d'a imachen",
-       "exif-pixelydimension": "Amplaria d'a imachen",
-       "exif-pixelxdimension": "Altaria d'a imachen",
+       "exif-pixelxdimension": "Amplaria d'a imachen",
+       "exif-pixelydimension": "Altaria d'a imachen",
        "exif-usercomment": "Comentarios de l'usuario",
        "exif-relatedsoundfile": "Fichero d'audio relacionato",
        "exif-datetimeoriginal": "Calendata y hora de cheneración d'os datos",
index 1ad03ef..447da76 100644 (file)
        "exif-colorspace": "فضاء الألوان",
        "exif-componentsconfiguration": "معنى كل مكونة",
        "exif-compressedbitsperpixel": "طور ضغط الصورة",
-       "exif-pixelydimension": "عرض الصورة",
-       "exif-pixelxdimension": "ارتفاع الصورة",
+       "exif-pixelxdimension": "عرض الصورة",
+       "exif-pixelydimension": "ارتفاع الصورة",
        "exif-usercomment": "تعليقات المستخدم",
        "exif-relatedsoundfile": "ملف صوتي مرتبط",
        "exif-datetimeoriginal": "تاريخ ووقت توليد البيانات",
        "redirect-not-exists": "المطلوب غير موجود",
        "fileduplicatesearch": "بحث عن ملفات مكررة",
        "fileduplicatesearch-summary": "ابحث عن الملفات المكررة بناء على قيم الهاش.",
-       "fileduplicatesearch-legend": "بحث عن مكرر",
        "fileduplicatesearch-filename": "اسم الملف:",
        "fileduplicatesearch-submit": "بحث",
        "fileduplicatesearch-info": "$1 × $2 بكسل<br />حجم الملف: $3<br />نوع MIME: $4",
index 0f69f6a..3cade1d 100644 (file)
        "exif-colorspace": "farq lon",
        "exif-componentsconfiguration": "maana kol mokawwin",
        "exif-compressedbitsperpixel": "tor daght sora",
-       "exif-pixelydimension": "ard sora sahih",
-       "exif-pixelxdimension": "tol sora sahih",
+       "exif-pixelxdimension": "ard sora sahih",
+       "exif-pixelydimension": "tol sora sahih",
        "exif-usercomment": "taaliqat lmostakhdim",
        "exif-relatedsoundfile": "milf sawti mortabit",
        "exif-datetimeoriginal": "tarikh o wqt tawlid lbayanat",
index 91089cc..a086c3e 100644 (file)
        "exif-colorspace": "فرق اللون",
        "exif-componentsconfiguration": "معنى كل مكون",
        "exif-compressedbitsperpixel": "طور ضغط الصورة",
-       "exif-pixelydimension": "عرض صورة صحيح",
-       "exif-pixelxdimension": "ارتفاع صورة صحيح",
+       "exif-pixelxdimension": "عرض صورة صحيح",
+       "exif-pixelydimension": "ارتفاع صورة صحيح",
        "exif-usercomment": "تعليقات اليوزر",
        "exif-relatedsoundfile": "ملف صوت مرتبط",
        "exif-datetimeoriginal": "تاريخ و وقت الإنتاج",
index e702f32..fb04fa0 100644 (file)
        "exif-colorspace": "ৰং স্থান",
        "exif-componentsconfiguration": "প্ৰতিটো উপাদানৰ অৰ্থ",
        "exif-compressedbitsperpixel": "ছবি সংকোচন অৱস্থা",
-       "exif-pixelydimension": "ছবিৰ প্ৰস্থতা",
-       "exif-pixelxdimension": "ছবিৰ উচ্চতা",
+       "exif-pixelxdimension": "ছবিৰ প্ৰস্থতা",
+       "exif-pixelydimension": "ছবিৰ উচ্চতা",
        "exif-usercomment": "সদস্যৰ মন্তব্য",
        "exif-relatedsoundfile": "সংশ্লিষ্ট শ্ৰব্য ফাইল",
        "exif-datetimeoriginal": "তথ্য সৃজনৰ তাৰিখ আৰু সময়",
index f547a60..62e3624 100644 (file)
        "noemail": "L'usuariu «$1» nun tien rexistrada nenguna direición de corréu.",
        "noemailcreate": "Tienes de conseñar una direición de corréu válida.",
        "passwordsent": "Unvióse una contraseña nueva a la direición de corréu rexistrada pa «$1».\nPor favor vuelvi a aniciar sesión depués de recibila.",
-       "blocked-mailpassword": "La edición ta bloquiada dende la to direición IP, y por tanto nun se permite usar la función de recuperar contraseñes pa evitar abusos.",
+       "blocked-mailpassword": "La to direición IP tien bloquiada la edición. Pa torgar los abusos, nun se permite usar la recuperación de contraseñes dende esta direición IP.",
        "eauthentsent": "Unvióse un corréu electrónicu de confirmación a la direición indicada.\nEnantes de que s'unvie nengún otru corréu a la cuenta, has de siguir les instrucciones d'esi corréu pa confirmar que la cuenta ye daveres de to.",
        "throttled-mailpassword": "Yá s'unvió un corréu de reaniciu la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.\nPa evitar abusos, namái s'unviará un corréu de reaniciu cada {{PLURAL:$1|hora|$1 hores}}.",
        "mailerror": "Fallu al unviar el corréu: $1",
        "uploadstash-badtoken": "Nun pudo facese esa operación. Seique caducó la identificación pa editar. Vuelve a tentalo.",
        "uploadstash-errclear": "Falló'l desaniciu de los ficheros.",
        "uploadstash-refresh": "Anovar la llista de ficheros",
+       "uploadstash-thumbnail": "ver miniatura",
        "invalid-chunk-offset": "Allugamientu inválidu del fragmentu",
        "img-auth-accessdenied": "Accesu denegáu",
        "img-auth-nopathinfo": "Falta PATH_INFO.\nEl to sirvidor nun ta configuráu pa pasar esta información.\nPue tar basáu en CGI y nun tener sofitu pa img_auth.\nVer https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "ipb-unblock": "Desbloquiar un nome d'usuariu o direición IP",
        "ipb-blocklist": "Ver los bloqueos esistentes",
        "ipb-blocklist-contribs": "Collaboraciones de {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "falten $1",
        "unblockip": "Desbloquiar usuariu",
        "unblockiptext": "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
        "ipusubmit": "Desaniciar esti bloquéu",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importaes}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importaes}} dende $2",
        "javascripttest": "Prueba de JavaScript",
-       "javascripttest-pagetext-noframework": "Esta páxina ta acutada pa executar pruebes de javascript.",
-       "javascripttest-pagetext-unknownframework": "L'entornu de pruebes «$1» ye desconocíu.",
        "javascripttest-pagetext-unknownaction": "Aición desconocida «$1».",
-       "javascripttest-pagetext-frameworks": "Escueyi un de los siguientes entornos de pruebes: $1",
-       "javascripttest-pagetext-skins": "Escueyi una apariencia pa executar les pruebes:",
        "javascripttest-qunit-intro": "Ver la [$1 documentación de les pruebes] en mediawiki.org.",
        "tooltip-pt-userpage": "La to páxina d'{{GENDER:|usuariu|usuaria}}",
        "tooltip-pt-anonuserpage": "La páxina d'usuariu de la IP cola que tas editando",
        "exif-colorspace": "Espaciu de color",
        "exif-componentsconfiguration": "Significáu de cada componente",
        "exif-compressedbitsperpixel": "Mou de compresión d'imaxe",
-       "exif-pixelydimension": "Anchor d'imaxe",
-       "exif-pixelxdimension": "Altor d'imaxe",
+       "exif-pixelxdimension": "Anchor d'imaxe",
+       "exif-pixelydimension": "Altor d'imaxe",
        "exif-usercomment": "Comentarios del usuariu",
        "exif-relatedsoundfile": "Archivu d'audiu rellacionáu",
        "exif-datetimeoriginal": "Data y hora de xeneración de los datos",
        "version-libraries-description": "Descripción",
        "version-libraries-authors": "Autores",
        "redirect": "Redireición por ID del ficheru, usuariu, páxina, revisión o rexistru",
-       "redirect-legend": "Redirixir a un ficheru o una páxina",
        "redirect-summary": "Esta páxina especial redirixe a un ficheru (dando'l so nome), una páxina (dando una ID de revisión o de páxina), una páxina d'usuariu (dando un númberu d'ID d'usuariu) o una entrada del rexistru (dando la ID del rexistru). Usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Dir",
        "redirect-lookup": "Buscar:",
        "redirect-not-exists": "Nun s'alcontró'l valor",
        "fileduplicatesearch": "Buscar archivos duplicaos",
        "fileduplicatesearch-summary": "Busca archivos duplicaos basándose nos sos valores fragmentarios.",
-       "fileduplicatesearch-legend": "Buscar duplicaos",
        "fileduplicatesearch-filename": "Nome del ficheru:",
        "fileduplicatesearch-submit": "Buscar",
        "fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamañu del archivu: $3<br />Triba MIME: $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexó}} a $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de {{GENDER:$3|$3}} dende $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|xubió}} $3",
        "api-error-unknownerror": "Fallu desconocíu: «$1».",
        "api-error-uploaddisabled": "Les xubíes tan desactivaes nesta wiki.",
        "api-error-verification-error": "Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.",
+       "api-error-was-deleted": "Anteriormente xubióse y desanicióse dempués un ficheru con esti nome.",
        "duration-seconds": "$1 {{PLURAL:$1|segundu|segundos}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutu|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|hora|hores}}",
        "special-characters-group-ipa": "AFI",
        "special-characters-group-symbols": "Símbolos",
        "special-characters-group-greek": "Griegu",
+       "special-characters-group-greekextended": "Griegu estendíu",
        "special-characters-group-cyrillic": "Cirílicu",
        "special-characters-group-arabic": "Árabe",
        "special-characters-group-arabicextended": "Árabe estendíu",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
        "sessionprovider-nocookies": "Les cookies puen tar desactivaes. Asegúrate de tener activaes les cookies y vuelve a principiar.",
-       "randomrootpage": "Páxina raíz al debalu"
+       "randomrootpage": "Páxina raíz al debalu",
+       "log-action-filter-block": "Tipu de bloquéu:",
+       "log-action-filter-delete": "Tipu de desaniciu:",
+       "log-action-filter-patrol": "Tipu de patrulla:",
+       "log-action-filter-protect": "Tipu de proteición:",
+       "log-action-filter-upload": "Tipu de carga:",
+       "log-action-filter-all": "Too",
+       "log-action-filter-block-block": "Bloquéu",
+       "log-action-filter-block-reblock": "Cambiu de bloquéu",
+       "log-action-filter-block-unblock": "Desbloquéu",
+       "log-action-filter-delete-delete": "Desaniciu de páxines",
+       "log-action-filter-delete-restore": "Restauración de páxines",
+       "log-action-filter-delete-event": "Desaniciu de rexistros",
+       "log-action-filter-delete-revision": "Desaniciu de revisión",
+       "log-action-filter-patrol-patrol": "Patrulláu manual",
+       "log-action-filter-patrol-autopatrol": "Patrulláu automáticu",
+       "log-action-filter-protect-protect": "Proteición",
+       "log-action-filter-protect-modify": "Cambiu na proteición",
+       "log-action-filter-protect-unprotect": "Desproteición",
+       "log-action-filter-upload-upload": "Nueva carga",
+       "log-action-filter-upload-overwrite": "Recargar"
 }
index f4d4d28..09906c4 100644 (file)
        "exif-exifversion": "Version exif",
        "exif-colorspace": "Ksevaxo",
        "exif-compressedbitsperpixel": "Ewavaraxivaracave",
-       "exif-pixelydimension": "Mante ke enafa ewava",
-       "exif-pixelxdimension": "Ontine ke enafa ewava",
+       "exif-pixelxdimension": "Mante ke enafa ewava",
+       "exif-pixelydimension": "Ontine ke enafa ewava",
        "exif-usercomment": "Favesikaf sebuks",
        "exif-relatedsoundfile": "Fichier audio lié",
        "exif-datetimeoriginal": "Viel is gemelt ke nasbara va origeem",
index 6cb75d2..0ee6435 100644 (file)
        "exif-colorspace": "रंग स्थान",
        "exif-componentsconfiguration": "हर घटक कय मतलब",
        "exif-compressedbitsperpixel": "चित्र कॉम्प्रेशन मोड",
-       "exif-pixelydimension": "छवि चौड़ाई",
-       "exif-pixelxdimension": "छवि ऊँचाई",
+       "exif-pixelxdimension": "छवि चौड़ाई",
+       "exif-pixelydimension": "छवि ऊँचाई",
        "exif-usercomment": "सदस्य टिप्पणी",
        "exif-relatedsoundfile": "संबंधित ध्वनी फ़ाईल",
        "exif-datetimeoriginal": "डेटा सञ्चालन कय मिति अव समय",
index 5a68e59..34ecba8 100644 (file)
        "exif-copyright": "Sahibinin müəlliflik hüququ",
        "exif-exifversion": "Exif versiyası",
        "exif-colorspace": "Rəng sahəsi",
-       "exif-pixelydimension": "Şəkilin eni",
-       "exif-pixelxdimension": "Şəkilin hündürlüyü",
+       "exif-pixelxdimension": "Şəkilin eni",
+       "exif-pixelydimension": "Şəkilin hündürlüyü",
        "exif-usercomment": "İstifadəçi şərhi",
        "exif-datetimeoriginal": "Orijinal tarix və vaxt",
        "exif-datetimedigitized": "Tarix və vaxt rəqəmləşdirilir",
index 3ac6686..0531723 100644 (file)
        "newarticle": "(یئنی)",
        "newarticletext": "مؤوجود اوْلمايان صحیفه‌‌يه اوْلان کئچیدی ایزله‌دینیز. \nآشاغیداکی ساحه‌‌يه مظمونونو يازاراق بۇ صحیفه‌‌نی '''سیز''' يارادا بیلرسینیز. (علاوه‌‌ معلومات اۆچون [$1 کؤمک صحیفه‌‌سینه] باخین). اگر بۇ صحیفه‌‌يه سهون گلمیسینیزسه ساده‌جه اوْلاراق براوزئرین '''گئری''' دۆيمه‌سینه وۇرون.",
        "anontalkpagetext": "''بو صحیفه قئیدیات‌دان کئچممیش و یا داخیل اولمامیش آنونیم ایستیفادچییه عایید موذاکیره صحیفه‌سی‌دیر.\nاونا گؤره بو ایستیفادچینی رقم‌لردن عبارت ایپ اونوانی ایله معین ائتمک مجبوریتیندییک.\nبئله ایپ اونوان بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز آنونیم ایستیفادچیسینیزسه و بو مئساژین سیزه عایید اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:UserLogin/signup|قئیدیات‌دان کئچین]] و یا [[Special:UserLogin|داخی اولون]].''",
-       "noarticletext": "ایندی بو صحیفه‌ده یازی یوخدور.\nسیز آیری صحیفه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]،\nیا دا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ایلگیلی قئیدلری آختارا بیلرسیز]،\nیا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صحیفه‌نی دَییشدیره بیلرسیز]</span>.",
+       "noarticletext": "ایندی بو صفحه‌ده یازی یوخدور.\nسیز آیری صفحه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]،\nیا دا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باغلی قئیدلری آختارا بیلرسیز]،\nیا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صفحه‌نی دَییشدیره بیلرسیز]</span>.",
        "noarticletext-nopermission": "بو صحیفه‌‌ ایندی بوشدور. \nباشقا صحیفه‌‌لرده عینی آددا صحیفه‌‌نی  [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],\nو يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.",
        "missing-revision": "«{{FULLPAGENAME}}» صحیفه‌سی اوچون $1 نومره‌لی نوسخه یوخدور.\n\nعموماُ بو ایشکال، واختی گئچمیش بیر باغلانتی ایله سیلینمیش بیر صحیفه‌یه گلنده، قاباغا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمک سیاهی]‌سینده باشقا بیلگیلر اولا بیلر.",
        "userpage-userdoesnotexist": "«$1» ایستیفاده‌چی حسابی یارانماییب‌دیر.\nبو صحیفه‌نی یارادماق یوخسا دَییشدیرمگینه بیر ده باخین.",
        "deleting-backlinks-warning": "'''اخطار:''' بو سیلمگه قصدینیز اولان صفحه‌یه، [[Special:WhatLinksHere/{{FULLPAGENAME}}|باشقا صفحه‌لر]] باغلانتی وئریب یا اونو اؤزلرین‌ده ایشلدیب‌لر.",
        "rollback": "اوولکی نوسخه لر",
        "rollbacklink": "قایتار",
-       "rollbacklinkcount": "$1 دییشدیرمه‌نی قایتار",
+       "rollbacklinkcount": "{{PLURAL:$1|دییشدیرمه}}نی قایتار",
        "rollbacklinkcount-morethan": "$1-دن چوْخ دییشدیرمه‌نی قایتار",
        "rollbackfailed": "گئری قایتارما اوغورسوزدور",
        "cantrollback": "دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیفه‌ده اولان یئگانه فالیت‌دیر.",
        "javascripttest": "جاوااسکریپت تِستی",
        "javascripttest-pagetext-unknownaction": "تانینمایان ایش «$1».",
        "javascripttest-qunit-intro": "mediawiki.org-دا [$1 تِست ائتمه سندلندیرمه‌لری]نه باخین.",
-       "tooltip-pt-userpage": "ایشلدن صفحه‌نیز",
+       "tooltip-pt-userpage": "ایشلدن صفحه‌{{GENDER:|نیز}}",
        "tooltip-pt-anonuserpage": "سیز او آی‌پی آدرسیله دَییشیکلیک ائتدیگینیز ایستیفاده‌چی صحیفه‌سی",
-       "tooltip-pt-mytalk": "دانیشیق صفحه‌نیز",
+       "tooltip-pt-mytalk": "{{GENDER:|سیزین}} دانیشیق صفحه‌نیز",
        "tooltip-pt-anontalk": "بو آی‌پی آدرسینین دَییشیکلیکلرینه گؤره دانیشیق",
-       "tooltip-pt-preferences": "ترجیحلرینیز",
+       "tooltip-pt-preferences": "{{GENDER:|سیزین}} ترجیحلرینیز",
        "tooltip-pt-watchlist": "دییشمکلرینی ایزله‌دیگینیز صفحه‌لرین سیاهی‌سی",
-       "tooltip-pt-mycontris": "سیزین چالیشمالارینیزین لیستی",
+       "tooltip-pt-mycontris": "{{GENDER:|سیزین}} چالیشمالارینیزین لیستی",
        "tooltip-pt-login": "گیریش ائتمه‌یینیز توصیه اولونور؛ اما گرکلی دئییل",
        "tooltip-pt-logout": "چیخیش",
        "tooltip-pt-createaccount": "سیزدن دعوت اولونور ایشلدن حسابی آچیب و گیریش ائده‌سیز؛ آنجاق حساب یاراتماق ایستگه باغلی‌دیر",
        "tooltip-t-recentchangeslinked": "بو صفحه‌دن باغلانان صفحه‌لرین سون دَییشیکلیک‌لری",
        "tooltip-feed-rss": "بو صحیفه‌‌ اوچون آراس‌اس يايیمی",
        "tooltip-feed-atom": "بو صحیفه‌‌ اوچون آتوم يايیمی",
-       "tooltip-t-contributions": "بو ایستیفاده‌چی‌نین وئردیگی دییشیکلر سیاهی‌سی",
+       "tooltip-t-contributions": "{{GENDER:$1|بۇ ایشلدنین}} وئردیگی دییشیکلر لیستی",
        "tooltip-t-emailuser": "بو ایستیفاده‌چی‌یه بیر ایمیل گؤندر",
        "tooltip-t-info": "بو صفحه‌یه گؤره آرتیق بیلگی",
        "tooltip-t-upload": "فایل‌لار یوکله",
        "exif-colorspace": "رنگ ساحه‌سی",
        "exif-componentsconfiguration": "هر بیلشنین معناسی",
        "exif-compressedbitsperpixel": "شکیل سیخیشدیرما فورماتی",
-       "exif-pixelydimension": "شکیلین انی",
-       "exif-pixelxdimension": "شکیلین اوزوناسی",
+       "exif-pixelxdimension": "شکیلین انی",
+       "exif-pixelydimension": "شکیلین اوزوناسی",
        "exif-usercomment": "استفادچی شرحی",
        "exif-relatedsoundfile": "حاقیندا سس لی فایل",
        "exif-datetimeoriginal": "اورژینال یاراتما زامانی",
        "redirect-not-exists": "دَگَر تاپیلمادی",
        "fileduplicatesearch": "دوبلیکات فايل آختاریشی",
        "fileduplicatesearch-summary": "تعمین ائتمک ديَری دؤشه‌مه‌سینده بنزر فايللاری آختار.",
-       "fileduplicatesearch-legend": "Dublikatı axtar",
        "fileduplicatesearch-filename": "فايل آدی:",
        "fileduplicatesearch-submit": "آختار",
        "fileduplicatesearch-info": "$1 × $2 پیکسِل<br />فایل اؤلچوسو: $3<br />MIME نوعو: $4",
index b9ad9f6..bf422d6 100644 (file)
        "exif-colorspace": "Төҫтәр киңлеге",
        "exif-componentsconfiguration": "Төҫ өлөштәренең төҙөлөшө",
        "exif-compressedbitsperpixel": "Рәсемде ҡыҫыу ысулы",
-       "exif-pixelydimension": "Рәсем киңлеге",
-       "exif-pixelxdimension": "Рәсем бейеклеге",
+       "exif-pixelxdimension": "Рәсем киңлеге",
+       "exif-pixelydimension": "Рәсем бейеклеге",
        "exif-usercomment": "Ҡулланыусы иҫкәрмәһе",
        "exif-relatedsoundfile": "Бәйле аудио файл",
        "exif-datetimeoriginal": "Төп көнө һәм ваҡыты",
        "redirect-not-exists": "Мәғәнәһе табылманы",
        "fileduplicatesearch": "Бер иш файлдарҙы эҙләү",
        "fileduplicatesearch-summary": "Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.",
-       "fileduplicatesearch-legend": "Бер иш файлдарҙы эҙләү",
        "fileduplicatesearch-filename": "Файл исеме:",
        "fileduplicatesearch-submit": "Эҙләү",
        "fileduplicatesearch-info": "$1 × $2 пиксел<br />Файлдың дәүмәле: $3<br />MIME төрө: $4",
index 943b13f..57f578c 100644 (file)
        "exif-colorspace": "فضا رنگ",
        "exif-componentsconfiguration": "معنی هر جز",
        "exif-compressedbitsperpixel": "مدل کمپرس کتن عکس",
-       "exif-pixelydimension": "معتبرین پهنات عکس",
-       "exif-pixelxdimension": "معتبرین ارتفاع عکس",
+       "exif-pixelxdimension": "معتبرین پهنات عکس",
+       "exif-pixelydimension": "معتبرین ارتفاع عکس",
        "exif-usercomment": "نظرات کاربر",
        "exif-relatedsoundfile": "مربوطین فایل صوتی",
        "exif-datetimeoriginal": "تاریح و وهد شرکتن دیتا",
index 99c880f..2888980 100644 (file)
        "exif-colorspace": "Espasyong kulay",
        "exif-componentsconfiguration": "Panabot kan lambang komponente",
        "exif-compressedbitsperpixel": "Moda nin kompresyon sa imahe",
-       "exif-pixelydimension": "Lakbang kan imahe",
-       "exif-pixelxdimension": "Langkaw kan imahe",
+       "exif-pixelxdimension": "Lakbang kan imahe",
+       "exif-pixelydimension": "Langkaw kan imahe",
        "exif-usercomment": "Mga komento kan paragamít",
        "exif-relatedsoundfile": "Kaakibay kan sagunson na pandangog",
        "exif-datetimeoriginal": "Petsa asin oras kan henerasyon nin datos",
index 747176c..a2fc059 100644 (file)
        "exif-colorspace": "Колеравая прастора",
        "exif-componentsconfiguration": "Канфігурацыя колеравых кампанэнтаў",
        "exif-compressedbitsperpixel": "Глыбіня колеру пасьля сьцісканьня",
-       "exif-pixelydimension": "Шырыня выявы",
-       "exif-pixelxdimension": "Вышыня выявы",
+       "exif-pixelxdimension": "Шырыня выявы",
+       "exif-pixelydimension": "Вышыня выявы",
        "exif-usercomment": "Камэнтары карыстальніка",
        "exif-relatedsoundfile": "Датычны аўдыё-файл",
        "exif-datetimeoriginal": "Дата і час утварэньня зьвестак",
        "redirect-not-exists": "Значэньне ня знойдзена",
        "fileduplicatesearch": "Пошук дублікатаў файлаў",
        "fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
-       "fileduplicatesearch-legend": "Пошук аднолькавых файлаў",
        "fileduplicatesearch-filename": "Назва файла:",
        "fileduplicatesearch-submit": "Шукаць",
        "fileduplicatesearch-info": "$1 × $2 піксэляў<br />Памер файла: $3<br />Тып MIME: $4",
index 2fbe6cc..3d478c1 100644 (file)
        "exif-colorspace": "Каляровая прастора",
        "exif-componentsconfiguration": "Значэнні кампанентаў",
        "exif-compressedbitsperpixel": "Лад сціскання выявы",
-       "exif-pixelydimension": "Шырыня выявы",
-       "exif-pixelxdimension": "Вышыня выявы",
+       "exif-pixelxdimension": "Шырыня выявы",
+       "exif-pixelydimension": "Вышыня выявы",
        "exif-usercomment": "Заўвагі карыстальніка",
        "exif-relatedsoundfile": "Дачынены гукавы файл",
        "exif-datetimeoriginal": "Дата і час стварэння дадзеных",
        "redirect-not-exists": "Значэнне не знойдзена",
        "fileduplicatesearch": "Пошук дублікатных файлаў",
        "fileduplicatesearch-summary": "Пошук дублікатных файлах на падставе іх хэшаў.",
-       "fileduplicatesearch-legend": "Знайсці дублікаты",
        "fileduplicatesearch-filename": "Назва файла:",
        "fileduplicatesearch-submit": "Знайсці",
        "fileduplicatesearch-info": "$1 × $2 кропак<br />Аб'ём файла: $3<br />Тып MIME: $4",
index bb8bf06..c88f2fe 100644 (file)
        "wrongpassword": "Въведената парола е невалидна. Опитайте отново.",
        "wrongpasswordempty": "Не е въведена парола. Опитайте отново.",
        "passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
+       "passwordtoolong": "Паролата не може да бъде по-дългa пт {{PLURAL:$1|1 символ|$1 символа}}.",
        "passwordtoopopular": "Често използвани пароли не могат да бъдат ползвани. Моля, изберете по-уникална парола.",
        "password-name-match": "Паролата ви трябва да се различава от потребителското ви име.",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "noemail": "Няма записана електронна поща за потребителя „$1“.",
        "noemailcreate": "Необходимо е да въведете валиден адрес за е-поща",
        "passwordsent": "Нова парола беше изпратена на електронната поща на „$1“.\nСлед като я получите, влезте отново.",
-       "blocked-mailpassword": "РедакÑ\82иÑ\80анеÑ\82о Ð¾Ñ\82 Ð²Ð°Ñ\88иÑ\8f IP-адÑ\80еÑ\81 Ðµ Ð·Ð°Ð±Ñ\80анено, Ð·Ð°Ñ\82ова Ð½Ðµ Ð²Ð¸ Ðµ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ да използвате възможността за възстановяване на парола.",
+       "blocked-mailpassword": "РедакÑ\82иÑ\80анеÑ\82о Ð¾Ñ\82 Ð\92аÑ\88иÑ\8f IP-адÑ\80еÑ\81 Ðµ Ð·Ð°Ð±Ñ\80анено, Ð·Ð°Ñ\82ова Ð½Ðµ Ð\92и Ñ\81е Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fва да използвате възможността за възстановяване на парола.",
        "eauthentsent": "Писмото за потвърждение е изпратено на посочения адрес. В него са описани действията, които трябва да се извършат, за да потвърдите, че този адрес за електронна поща действително е ваш.",
        "throttled-mailpassword": "Функцията за напомняне на паролата е използвана през {{PLURAL:$1|последния един час|последните $1 часа}}.\nЗа предотвратяване на злоупотреби е разрешено да се изпраща не повече от едно напомняне в рамките на {{PLURAL:$1|един час|$1 часа}}.",
        "mailerror": "Грешка при изпращане на писмо: $1",
        "exif-colorspace": "Цветово пространство",
        "exif-componentsconfiguration": "Значение на всеки компонент",
        "exif-compressedbitsperpixel": "Режим на компресия на образа",
-       "exif-pixelydimension": "Ширина на изображението",
-       "exif-pixelxdimension": "Височина на изображението",
+       "exif-pixelxdimension": "Ширина на изображението",
+       "exif-pixelydimension": "Височина на изображението",
        "exif-usercomment": "Допълнителни коментари",
        "exif-relatedsoundfile": "Свързан звуков файл",
        "exif-datetimeoriginal": "Дата и час на създаване",
        "redirect-not-exists": "Стойността не е намерена",
        "fileduplicatesearch": "Търсене на повтарящи се файлове",
        "fileduplicatesearch-summary": "Търсене на повтарящи се файлове на база хеш стойности.",
-       "fileduplicatesearch-legend": "Търсене на повтарящ се файл",
        "fileduplicatesearch-filename": "Име на файл:",
        "fileduplicatesearch-submit": "Търсене",
        "fileduplicatesearch-info": "$1 × $2 пиксела<br />Размер на файла: $3<br />MIME тип: $4",
        "htmlform-chosen-placeholder": "Избиране",
        "htmlform-cloner-create": "Добавяне на още",
        "htmlform-cloner-delete": "Премахване",
+       "htmlform-title-not-exists": "$1 не съществува.",
        "sqlite-has-fts": "$1 с поддръжка на пълнотекстово търсене",
        "sqlite-no-fts": "$1 без поддръжка на пълнотекстово търсене",
        "logentry-delete-delete": "$1 {{GENDER:$2|изтри}} страницата $3",
        "pagelang-language": "Език",
        "pagelang-use-default": "Използване на езика по подразбиране",
        "pagelang-select-lang": "Избиране на език",
+       "pagelang-submit": "Изпращане",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "log-name-pagelang": "Дневник на езиковите промени",
        "mw-widgets-titleinput-description-new-page": "страницата все още не съществува",
        "mw-widgets-titleinput-description-redirect": "пренасочване към $1",
        "api-error-blacklisted": "Моля, изберете различно, описателно заглавие.",
-       "randomrootpage": "Случайна начална страница"
+       "randomrootpage": "Случайна начална страница",
+       "log-action-filter-protect": "Тип защита:",
+       "log-action-filter-upload": "Тип качване:",
+       "log-action-filter-all": "Всички",
+       "log-action-filter-block-block": "Блокиране",
+       "log-action-filter-block-reblock": "Промяна на блокирането",
+       "log-action-filter-block-unblock": "Отблокиране",
+       "log-action-filter-upload-upload": "Ново качване",
+       "log-action-filter-upload-overwrite": "Повторно качване"
 }
index 924dc8e..15bca16 100644 (file)
        "exif-colorspace": "رنگاني فضا",
        "exif-componentsconfiguration": "هریک شه مووله په ئانی مانا",
        "exif-compressedbitsperpixel": "اکس ئی پشرده ئی هالت",
-       "exif-pixelydimension": "اکسئ گۆر",
-       "exif-pixelxdimension": "اکسئ بُرزی",
+       "exif-pixelxdimension": "اکسئ گۆر",
+       "exif-pixelydimension": "اکسئ بُرزی",
        "exif-usercomment": "کار زوروکئ توضیحات",
        "exif-relatedsoundfile": "مربوتین توارین پایل",
        "exif-datetimeoriginal": "دیتائانی ودئ بوتین ئی تاریخ و وخت",
index 9648250..7af3b48 100644 (file)
        "exif-colorspace": "Kamar kalir",
        "exif-componentsconfiguration": "Arti matan tiap kumpunin",
        "exif-compressedbitsperpixel": "Muda kumprasi gambar",
-       "exif-pixelydimension": "Lingai gambar",
-       "exif-pixelxdimension": "Pancau gambar",
+       "exif-pixelxdimension": "Lingai gambar",
+       "exif-pixelydimension": "Pancau gambar",
        "exif-usercomment": "Kumintar pamuruk",
        "exif-relatedsoundfile": "Barkas suara bahubung",
        "exif-datetimeoriginal": "Tanggal wan wayah paulahan data",
index 000e61b..72c5c44 100644 (file)
        "category-media-header": "\"$1\" বিষয়শ্রেণীতে অন্তর্ভুক্ত মিডিয়া ফাইলগুলি",
        "category-empty": "''এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।''",
        "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী|লুকায়িত বিষয়শ্রেণীসমূহ}}",
-       "hidden-category-category": "লà§\81à¦\95à§\8dà¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ",
+       "hidden-category-category": "লুকায়িত বিষয়শ্রেণীসমূহ",
        "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
        "category-subcat-count-limited": "এই বিষয়শ্রেণীতে নিচের {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী আছে}}।",
        "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হল।}}",
        "exif-colorspace": "রঙ জগৎ",
        "exif-componentsconfiguration": "প্রতিটি উপাদানের অর্থ",
        "exif-compressedbitsperpixel": "ছবি সংকোচন মোড",
-       "exif-pixelydimension": "চিত্রের প্রস্থ",
-       "exif-pixelxdimension": "চিত্রের উচ্চতা",
+       "exif-pixelxdimension": "চিত্রের প্রস্থ",
+       "exif-pixelydimension": "চিত্রের উচ্চতা",
        "exif-usercomment": "ব্যবহারকারীর মন্তব্য",
        "exif-relatedsoundfile": "সংশ্লিষ্ট অডিও ফাইল",
        "exif-datetimeoriginal": "উপাত্ত উৎপাদনের তারিখ ও সময়",
        "redirect-not-exists": "মান পাওয়া যায়নি",
        "fileduplicatesearch": "সদৃশ ফাইলের জন্য অনুসন্ধান",
        "fileduplicatesearch-summary": "হ্যাশ ভ্যালুর ওর ভিত্তি করে একই ছবিগুলো খুঁজুন।",
-       "fileduplicatesearch-legend": "অনুলিপির জন্য অনুসন্ধান",
        "fileduplicatesearch-filename": "ফাইলনাম:",
        "fileduplicatesearch-submit": "অনুসন্ধান",
        "fileduplicatesearch-info": "$1 × $2 পিক্সেল<br />ফাইলের আকার: $3<br />এমআইএমই প্রকার: $4",
index c542737..28203d3 100644 (file)
        "exif-colorspace": "Lec'h al livioù",
        "exif-componentsconfiguration": "Talvoudegezh pep parzh",
        "exif-compressedbitsperpixel": "Doare gwaskañ ar skeudenn",
-       "exif-pixelydimension": "Ledander ar skeudenn",
-       "exif-pixelxdimension": "Sav ar skeudenn",
+       "exif-pixelxdimension": "Ledander ar skeudenn",
+       "exif-pixelydimension": "Sav ar skeudenn",
        "exif-usercomment": "Evezhiadennoù",
        "exif-relatedsoundfile": "Restr son stag",
        "exif-datetimeoriginal": "Deiziad hag eur ar sevel roadoù",
index 83d271e..efc2387 100644 (file)
        "exif-colorspace": "Prostor boje",
        "exif-componentsconfiguration": "Značenje svake komponente",
        "exif-compressedbitsperpixel": "Način kompresije slike",
-       "exif-pixelydimension": "Širina slike",
-       "exif-pixelxdimension": "Visina slike",
+       "exif-pixelxdimension": "Širina slike",
+       "exif-pixelydimension": "Visina slike",
        "exif-usercomment": "Korisnički komentari",
        "exif-relatedsoundfile": "Povezana zvučna datoteka",
        "exif-datetimeoriginal": "Datum i vrijeme generisanja podataka",
index 33b619a..74a95a3 100644 (file)
        "exif-colorspace": "Espai de color",
        "exif-componentsconfiguration": "Significat de cada component",
        "exif-compressedbitsperpixel": "Mode de compressió d'imatge",
-       "exif-pixelydimension": "Amplada de la imatge",
-       "exif-pixelxdimension": "Alçada de la imatge",
+       "exif-pixelxdimension": "Amplada de la imatge",
+       "exif-pixelydimension": "Alçada de la imatge",
        "exif-usercomment": "Comentaris de l'usuari",
        "exif-relatedsoundfile": "Fitxer d'àudio relacionat",
        "exif-datetimeoriginal": "Dia i hora de generació de les dades",
        "redirect-not-exists": "No s'ha trobat el valor",
        "fileduplicatesearch": "Cerca fitxers duplicats",
        "fileduplicatesearch-summary": "Cerca fitxers duplicats d'acord amb el seu valor de resum.",
-       "fileduplicatesearch-legend": "Cerca duplicats",
        "fileduplicatesearch-filename": "Nom del fitxer:",
        "fileduplicatesearch-submit": "Cerca",
        "fileduplicatesearch-info": "$1 × $2 píxels<br />Mida del fitxer: $3<br />Tipus MIME: $4",
        "log-action-filter-patrol": "Tipus de patrullatge:",
        "log-action-filter-protect": "Tipus de protecció:",
        "log-action-filter-upload": "Tipus de càrrega:",
+       "log-action-filter-all": "Tota",
+       "log-action-filter-block-block": "Bloca",
+       "log-action-filter-block-reblock": "Bloca la modificació",
+       "log-action-filter-block-unblock": "Desbloca",
+       "log-action-filter-delete-delete": "Supressió de pàgines",
+       "log-action-filter-delete-restore": "Restauració de pàgines",
+       "log-action-filter-delete-event": "Registre de supressió",
+       "log-action-filter-delete-revision": "Supressió de revisions",
+       "log-action-filter-patrol-patrol": "Patrullatge manual",
+       "log-action-filter-patrol-autopatrol": "Patrullatge automàtic",
        "log-action-filter-protect-protect": "Protecció",
        "log-action-filter-protect-modify": "Modificació de la protecció",
        "log-action-filter-protect-unprotect": "Desprotecció",
index 4a69007..461462a 100644 (file)
        "exif-colorspace": "Беснашан хьал",
        "exif-componentsconfiguration": "Бесара компонентин конфигураци",
        "exif-compressedbitsperpixel": "Бесан кIоргалла дацдина чул тӀехьа",
-       "exif-pixelydimension": "Суьртан шоралла",
-       "exif-pixelxdimension": "Суьртан локхалла",
+       "exif-pixelxdimension": "Суьртан шоралла",
+       "exif-pixelydimension": "Суьртан локхалла",
        "exif-usercomment": "Кхин тӀе къамел",
        "exif-relatedsoundfile": "Къамелан аьзнийн файл",
        "exif-datetimeoriginal": "Дуьххьарлера терахь а хан",
index b549436..2750f4b 100644 (file)
        "exif-artist": "نووسەر",
        "exif-exifversion": "وەشانی exif",
        "exif-colorspace": "بۆشایی ره‌نگ",
-       "exif-pixelydimension": "پانی وێنە",
-       "exif-pixelxdimension": "بەرزی وێنە",
+       "exif-pixelxdimension": "پانی وێنە",
+       "exif-pixelydimension": "بەرزی وێنە",
        "exif-usercomment": "بۆچوونەکانی بەکارھێنەر",
        "exif-relatedsoundfile": "فایلی ده‌نگی لێکچوو",
        "exif-datetimeoriginal": "ڕێکەوت و کاتی بەرھەمھێنانی داتا",
        "redirect-file": "ناوی پەڕگە",
        "fileduplicatesearch": "گەڕان بۆ پەڕگە دووپات کراوەکان",
        "fileduplicatesearch-summary": "گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.",
-       "fileduplicatesearch-legend": "گەڕان بۆ دووبارەکردنێک",
        "fileduplicatesearch-filename": "ناوی پەرگە:",
        "fileduplicatesearch-submit": "گەڕان",
        "fileduplicatesearch-info": "$1 × $2 پیکسەل<br />قەبارەی پەڕگە: $3<br />MIME جۆری: $4",
index 5ff68d3..01c3cf9 100644 (file)
        "exif-colorspace": "Barevný prostor",
        "exif-componentsconfiguration": "Význam jednotlivých složek",
        "exif-compressedbitsperpixel": "Komprimační režim",
-       "exif-pixelydimension": "Šířka obrázku",
-       "exif-pixelxdimension": "Výška obrázku",
+       "exif-pixelxdimension": "Šířka obrázku",
+       "exif-pixelydimension": "Výška obrázku",
        "exif-usercomment": "Uživatelské poznámky",
        "exif-relatedsoundfile": "Související zvukový soubor",
        "exif-datetimeoriginal": "Datum a čas pořízení obrázku",
        "redirect-not-exists": "Hodnota nenalezena",
        "fileduplicatesearch": "Hledání duplicitních souborů",
        "fileduplicatesearch-summary": "Hledání duplicitních souborů podle jejich hašů.",
-       "fileduplicatesearch-legend": "Hledání duplikátů",
        "fileduplicatesearch-filename": "Jméno souboru:",
        "fileduplicatesearch-submit": "Hledat",
        "fileduplicatesearch-info": "(rozměr: $1 × $2 pixelů, velikost souboru: $3, MIME typ: $4)",
index 3ff54a8..2e2ff94 100644 (file)
        "exif-colorspace": "Gofod lliw",
        "exif-componentsconfiguration": "Ystyr pob cydran",
        "exif-compressedbitsperpixel": "Modd cywasgu delwedd",
-       "exif-pixelydimension": "Lled y ddelwedd",
-       "exif-pixelxdimension": "Uchder y ddelwedd",
+       "exif-pixelxdimension": "Lled y ddelwedd",
+       "exif-pixelydimension": "Uchder y ddelwedd",
        "exif-usercomment": "Sylwadau'r defnyddiwr",
        "exif-relatedsoundfile": "Ffeil sain gysylltiedig",
        "exif-datetimeoriginal": "Dyddiad ac amser y cynhyrchwyd y data",
index 068164e..cde3710 100644 (file)
        "exif-colorspace": "Farverum",
        "exif-componentsconfiguration": "Betydning af enkelte komponenter",
        "exif-compressedbitsperpixel": "Komprimerede bits pr. pixel",
-       "exif-pixelydimension": "Billedbredde",
-       "exif-pixelxdimension": "Billedhøjde",
+       "exif-pixelxdimension": "Billedbredde",
+       "exif-pixelydimension": "Billedhøjde",
        "exif-usercomment": "Brugerkommentarer",
        "exif-relatedsoundfile": "Tilhørende lydfil",
        "exif-datetimeoriginal": "Optagelsestidspunkt",
index 2b1453d..5890222 100644 (file)
        "exif-colorspace": "Farbraum",
        "exif-componentsconfiguration": "Bedeutung einzelner Komponenten",
        "exif-compressedbitsperpixel": "Komprimierte Bits pro Pixel",
-       "exif-pixelydimension": "Bildbreite",
-       "exif-pixelxdimension": "Bildhöhe",
+       "exif-pixelxdimension": "Bildbreite",
+       "exif-pixelydimension": "Bildhöhe",
        "exif-usercomment": "Benutzerkommentare",
        "exif-relatedsoundfile": "Zugehörige Tondatei",
        "exif-datetimeoriginal": "Erfassungszeitpunkt",
        "redirect-not-exists": "Der Wert wurde nicht gefunden",
        "fileduplicatesearch": "Dateiduplikatsuche",
        "fileduplicatesearch-summary": "Suche nach Dateiduplikaten auf Basis ihres Hashwertes.",
-       "fileduplicatesearch-legend": "Suche nach Duplikaten",
        "fileduplicatesearch-filename": "Dateiname:",
        "fileduplicatesearch-submit": "Suchen",
        "fileduplicatesearch-info": "$1 × $2 Pixel<br />Dateigröße: $3<br />MIME-Typ: $4",
index 059ce8b..3e05bd4 100644 (file)
        "exif-colorspace": "Cayê rengi",
        "exif-componentsconfiguration": "manayê qisimê hemi",
        "exif-compressedbitsperpixel": "Modê komprasyonê resimi",
-       "exif-pixelydimension": "Herayeya resimi",
-       "exif-pixelxdimension": "Berzeya resimi",
+       "exif-pixelxdimension": "Herayeya resimi",
+       "exif-pixelydimension": "Berzeya resimi",
        "exif-usercomment": "Mışewreyê karberi",
        "exif-relatedsoundfile": "Derhekê dosya yê vengi",
        "exif-datetimeoriginal": "Zeman u tarixê data varaziyayişi",
index 0817b87..b0f2852 100644 (file)
        "exif-colorspace": "Barwowy rum",
        "exif-componentsconfiguration": "Wóznam jadnotliwych komponentow",
        "exif-compressedbitsperpixel": "Kompriměrowane bity na piksel",
-       "exif-pixelydimension": "Šyrokosć wobraza",
-       "exif-pixelxdimension": "Wusokosć wobraza",
+       "exif-pixelxdimension": "Šyrokosć wobraza",
+       "exif-pixelydimension": "Wusokosć wobraza",
        "exif-usercomment": "Komentary wužywarja",
        "exif-relatedsoundfile": "Pśisłušna zukowa dataja",
        "exif-datetimeoriginal": "Datum a cas wutwórjenja datow",
index 0141f08..400cd91 100644 (file)
        "exif-colorspace": "Χρωματική περιοχή",
        "exif-componentsconfiguration": "Νόημα του κάθε στοιχείου",
        "exif-compressedbitsperpixel": "Κατάσταση συμπίεσης εικόνας",
-       "exif-pixelydimension": "Πλάτος εικόνας",
-       "exif-pixelxdimension": "Ύψος εικόνας",
+       "exif-pixelxdimension": "Πλάτος εικόνας",
+       "exif-pixelydimension": "Ύψος εικόνας",
        "exif-usercomment": "Σχόλια χρήστη",
        "exif-relatedsoundfile": "Σχετικό αρχείο ήχου",
        "exif-datetimeoriginal": "Ημερομηνία και ώρα της παραγωγής ψηφιακών δεδομένων",
index 6489ca3..48e6cd0 100644 (file)
        "exif-colorspace": "Color space",
        "exif-componentsconfiguration": "Meaning of each component",
        "exif-compressedbitsperpixel": "Image compression mode",
-       "exif-pixelydimension": "Image width",
-       "exif-pixelxdimension": "Image height",
+       "exif-pixelxdimension": "Image width",
+       "exif-pixelydimension": "Image height",
        "exif-usercomment": "User comments",
        "exif-relatedsoundfile": "Related audio file",
        "exif-datetimeoriginal": "Date and time of data generation",
        "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
        "confirmemail_invalidated": "Email address confirmation canceled",
        "invalidateemail": "Cancel email confirmation",
+       "notificationemail_subject_changed": "{{SITENAME}} registered email address has been changed",
+       "notificationemail_subject_removed": "{{SITENAME}} registered email address has been removed",
+       "notificationemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to \"$3\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.",
+       "notificationemail_body_removed": "Someone, probably you, from IP address $1,\nhas removed the email address of the account \"$2\" on {{SITENAME}}.\n\nIf this was not you, contact a site administrator immediately.",
        "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
        "scarytranscludefailed": "[Template fetch failed for $1]",
        "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
index 2a819ea..ae00baa 100644 (file)
        "exif-colorspace": "Kolor-spaco",
        "exif-componentsconfiguration": "Signifo de ĉiu kompono",
        "exif-compressedbitsperpixel": "Reĝimo de bilda densigado",
-       "exif-pixelydimension": "Larĝeco de bildo",
-       "exif-pixelxdimension": "Alteco de bildo",
+       "exif-pixelxdimension": "Larĝeco de bildo",
+       "exif-pixelydimension": "Alteco de bildo",
        "exif-usercomment": "Komentoj de uzanto",
        "exif-relatedsoundfile": "Rilata son-dosiero",
        "exif-datetimeoriginal": "Dato kaj tempo de datuma generado",
        "redirect-not-exists": "Valoro ne trovita",
        "fileduplicatesearch": "Serĉu duplikatajn dosierojn",
        "fileduplicatesearch-summary": "Serĉi duplikatajn dosierojn bazite de haketvaloro.",
-       "fileduplicatesearch-legend": "Serĉi duplikaton",
        "fileduplicatesearch-filename": "Dosiernomo:",
        "fileduplicatesearch-submit": "Serĉi",
        "fileduplicatesearch-info": "$1 × $2 rastrumero<br />Dosiera pezo: $3<br />MIME-tipo: $4",
index 4c215cc..f9eaa4c 100644 (file)
        "exif-colorspace": "Espacio de color",
        "exif-componentsconfiguration": "Significado de cada componente",
        "exif-compressedbitsperpixel": "Modo de compresión de la imagen",
-       "exif-pixelydimension": "Ancho de la imagen",
-       "exif-pixelxdimension": "Altura de la imagen",
+       "exif-pixelxdimension": "Ancho de la imagen",
+       "exif-pixelydimension": "Altura de la imagen",
        "exif-usercomment": "Comentarios de usuario",
        "exif-relatedsoundfile": "Archivo de audio relacionado",
        "exif-datetimeoriginal": "Fecha y hora de la generación de los datos",
        "redirect-not-exists": "No se encontró el valor",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
-       "fileduplicatesearch-legend": "Busca duplicados",
        "fileduplicatesearch-filename": "Nombre de archivo:",
        "fileduplicatesearch-submit": "Buscar",
        "fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamaño: $3<br />Tipo MIME: $4",
index ad15418..9b7ab63 100644 (file)
        "exif-colorspace": "Värviruum",
        "exif-componentsconfiguration": "Iga komponendi tähendus",
        "exif-compressedbitsperpixel": "Pildi pakkimise meetod",
-       "exif-pixelydimension": "Pildi laius",
-       "exif-pixelxdimension": "Pildi kõrgus",
+       "exif-pixelxdimension": "Pildi laius",
+       "exif-pixelydimension": "Pildi kõrgus",
        "exif-usercomment": "Kasutaja kommentaarid",
        "exif-relatedsoundfile": "Seotud helifail",
        "exif-datetimeoriginal": "Andmete loomise kuupäev ja kellaaeg",
index 7898f48..09c8349 100644 (file)
        "exif-colorspace": "Kolore tartea",
        "exif-componentsconfiguration": "Osagai bakoitzaren esanahia",
        "exif-compressedbitsperpixel": "Irudi konpresio mota",
-       "exif-pixelydimension": "Irudiaren zabalera",
-       "exif-pixelxdimension": "Irudiaren altuera",
+       "exif-pixelxdimension": "Irudiaren zabalera",
+       "exif-pixelydimension": "Irudiaren altuera",
        "exif-usercomment": "Erabiltzailearen iruzkinak",
        "exif-relatedsoundfile": "Harremanetan dagoen audio fitxategia",
        "exif-datetimeoriginal": "Datuen sorreraren data eta ordua",
        "redirect-not-exists": "Ez da baliorik aurkitu",
        "fileduplicatesearch": "Artxibo bikoiztuen bilaketa",
        "fileduplicatesearch-summary": "Bikoiztutako fitxategiak bilatu bere hash balioaren arabera.",
-       "fileduplicatesearch-legend": "Duplikatu bat bilatu",
        "fileduplicatesearch-filename": "Fitxategi izena:",
        "fileduplicatesearch-submit": "Bilaketa",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Fitxategiaren tamaina: $3<br />MIME mota: $4",
index ba57308..ea5fb44 100644 (file)
        "exif-colorspace": "Espaciu e colol",
        "exif-componentsconfiguration": "Senificau e ca componenti",
        "exif-compressedbitsperpixel": "Mó de compresión la imahin",
-       "exif-pixelydimension": "Anchón la imahin premitiu",
-       "exif-pixelxdimension": "Artu la imahin premitiu",
+       "exif-pixelxdimension": "Anchón la imahin premitiu",
+       "exif-pixelydimension": "Artu la imahin premitiu",
        "exif-usercomment": "Comentárius del usuáriu",
        "exif-relatedsoundfile": "Archivu d'audiu relacionau",
        "exif-datetimeoriginal": "Fecha i ora la heneración los datus",
index ae34257..1a4c120 100644 (file)
        "exif-colorspace": "فضای رنگی",
        "exif-componentsconfiguration": "معنی هر یک از مؤلفه‌ها",
        "exif-compressedbitsperpixel": "حالت فشرده‌سازی تصویر",
-       "exif-pixelydimension": "پهنای تصویر",
-       "exif-pixelxdimension": "بلندی تصویر",
+       "exif-pixelxdimension": "پهنای تصویر",
+       "exif-pixelydimension": "بلندی تصویر",
        "exif-usercomment": "توضیحات کاربر",
        "exif-relatedsoundfile": "پروندهٔ صوتی مربوط",
        "exif-datetimeoriginal": "تاریخ و زمان تولید داده‌ها",
        "redirect-not-exists": "مقدار پیدا نشد",
        "fileduplicatesearch": "جستجو برای پرونده‌های تکراری",
        "fileduplicatesearch-summary": "جستجو برای پرونده‌های تکراری بر اساس مقدار درهم‌شدهٔ آن‌ها صورت می‌گیرد.",
-       "fileduplicatesearch-legend": "جستجوی موارد تکراری",
        "fileduplicatesearch-filename": "نام پرونده:",
        "fileduplicatesearch-submit": "جستجو",
        "fileduplicatesearch-info": "<span dir=\"ltr\">$1 × $2</span> پیکسل<br />اندازهٔ پرونده: $3<br />نوع MIME: $4",
index 1782a7f..a5d794e 100644 (file)
        "exif-colorspace": "Väriavaruus",
        "exif-componentsconfiguration": "Kunkin komponentin määritelmä",
        "exif-compressedbitsperpixel": "Kuvan pakkaustapa",
-       "exif-pixelydimension": "Kuvan leveys",
-       "exif-pixelxdimension": "Kuvan korkeus",
+       "exif-pixelxdimension": "Kuvan leveys",
+       "exif-pixelydimension": "Kuvan korkeus",
        "exif-usercomment": "Käyttäjän kommentit",
        "exif-relatedsoundfile": "Liitetty äänitiedosto",
        "exif-datetimeoriginal": "Luontipäivämäärä",
        "redirect-not-exists": "Arvoa ei löytynyt",
        "fileduplicatesearch": "Kaksoiskappaleiden haku",
        "fileduplicatesearch-summary": "Etsii tiedoston kaksoiskappaleita hajautusarvon perusteella.",
-       "fileduplicatesearch-legend": "Etsi kaksoiskappaleita",
        "fileduplicatesearch-filename": "Tiedostonimi",
        "fileduplicatesearch-submit": "Etsi",
        "fileduplicatesearch-info": "$1 × $2 kuvapistettä<br />Tiedostokoko: $3<br />MIME-tyyppi: $4",
index ffa35ca..3ac44b1 100644 (file)
        "recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|une page ajoutée|$2 pages ajoutées}}]] à la catégorie",
        "recentchanges-page-removed-from-category": "[[:$1]] supprimé de la catégorie",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|une page|$2 pages}}]] {{PLURAL:$2|retirée|retirées}} de la catégorie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|une page retirée|$2 pages retirées}}]] de la catégorie",
        "autochange-username": "Modification automatique de MediaWiki",
        "upload": "Importer un fichier",
        "uploadbtn": "Importer le fichier",
        "exif-colorspace": "Espace colorimétrique",
        "exif-componentsconfiguration": "Signification de chaque composante",
        "exif-compressedbitsperpixel": "Mode de compression de l'image",
-       "exif-pixelydimension": "Largeur de l'image",
-       "exif-pixelxdimension": "Hauteur de l'image",
+       "exif-pixelxdimension": "Largeur de l'image",
+       "exif-pixelydimension": "Hauteur de l'image",
        "exif-usercomment": "Commentaires de l'utilisateur",
        "exif-relatedsoundfile": "Fichier audio associé",
        "exif-datetimeoriginal": "Date de la prise originelle",
        "redirect-not-exists": "Valeur non trouvée",
        "fileduplicatesearch": "Recherche de doublons",
        "fileduplicatesearch-summary": "Recherche des copies de fichiers identiques d'après leur empreinte de hachage.",
-       "fileduplicatesearch-legend": "Rechercher un doublon",
        "fileduplicatesearch-filename": "Nom du fichier :",
        "fileduplicatesearch-submit": "Rechercher",
        "fileduplicatesearch-info": "$1 × $2 pixels<br />Taille du fichier : $3<br />Type MIME : $4",
        "log-action-filter-delete": "Type de suppression :",
        "log-action-filter-patrol": "Type de patrouille :",
        "log-action-filter-protect": "Type de protection :",
-       "log-action-filter-upload": "Type de téléchargement:",
+       "log-action-filter-upload": "Type de téléversement :",
        "log-action-filter-all": "Tout",
-       "log-action-filter-block-block": "Bloc",
-       "log-action-filter-block-reblock": "Modification de bloc",
+       "log-action-filter-block-block": "Blocage",
+       "log-action-filter-block-reblock": "Modification de blocage",
        "log-action-filter-block-unblock": "Débloquer",
        "log-action-filter-delete-delete": "Suppression de pages",
        "log-action-filter-delete-restore": "Restauration de page",
        "log-action-filter-delete-event": "Suppression du journal",
-       "log-action-filter-delete-revision": "Supression de révison",
+       "log-action-filter-delete-revision": "Suppression de révison",
        "log-action-filter-patrol-patrol": "Patrouille manuelle",
        "log-action-filter-patrol-autopatrol": "Patrouille automatique",
        "log-action-filter-protect-protect": "Protection",
        "log-action-filter-protect-modify": "Modification de la protection",
        "log-action-filter-protect-unprotect": "Levée de la protection",
        "log-action-filter-upload-upload": "Nouveau téléversement",
-       "log-action-filter-upload-overwrite": "Reitérer le téléversement"
+       "log-action-filter-upload-overwrite": "Réitérer le téléversement"
 }
index 62088d2..7e9235d 100644 (file)
        "exif-colorspace": "Èspâço colorimètrico",
        "exif-componentsconfiguration": "Significacion de châque composenta",
        "exif-compressedbitsperpixel": "Fôrma de comprèssion de l’émâge",
-       "exif-pixelydimension": "Largior de l’émâge",
-       "exif-pixelxdimension": "Hôtior de l’émâge",
+       "exif-pixelxdimension": "Largior de l’émâge",
+       "exif-pixelydimension": "Hôtior de l’émâge",
        "exif-usercomment": "Comentèros de l’utilisator",
        "exif-relatedsoundfile": "Fichiér ôdiô associyê",
        "exif-datetimeoriginal": "Dâta et hora de la prêsa originâla",
index e5b4171..d95029f 100644 (file)
        "exif-colorspace": "Klöörenrüm",
        "exif-componentsconfiguration": "Enkelt komponenten",
        "exif-compressedbitsperpixel": "Komprimiaret bits per pixel",
-       "exif-pixelydimension": "Bilbreetje",
-       "exif-pixelxdimension": "Bilhööchde",
+       "exif-pixelxdimension": "Bilbreetje",
+       "exif-pixelydimension": "Bilhööchde",
        "exif-usercomment": "Brüker komentaaren",
        "exif-relatedsoundfile": "Ferbünjen tuundatei",
        "exif-datetimeoriginal": "Dootem an klooktidj faan't knipsin",
index 36a2170..f7154da 100644 (file)
        "exif-exifversion": "Exif-ferzje",
        "exif-colorspace": "Kleurromte",
        "exif-compressedbitsperpixel": "Ofbylding kompresjemetoade",
-       "exif-pixelydimension": "Ofbyldingsbreedte",
-       "exif-pixelxdimension": "Ofbyldingshichte",
+       "exif-pixelxdimension": "Ofbyldingsbreedte",
+       "exif-pixelydimension": "Ofbyldingshichte",
        "exif-usercomment": "Opmerkings",
        "exif-relatedsoundfile": "Besibbe audiotriem",
        "exif-datetimeoriginal": "Tiidstip gegevensoanmaak",
        "redirect-file": "Triemnamme",
        "redirect-not-exists": "Wearde net fûn",
        "fileduplicatesearch": "Sykje op duplikaten",
-       "fileduplicatesearch-legend": "Sykje op duplikaten",
        "fileduplicatesearch-filename": "Triemnamme:",
        "fileduplicatesearch-submit": "Sykje",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Triemgrutte: $3<br />MIME-type: $4",
index 170d19e..06cbd5c 100644 (file)
        "exif-colorspace": "Dathspás",
        "exif-componentsconfiguration": "Ciall le gach giota",
        "exif-compressedbitsperpixel": "Modh chomhbhrú na n-íomhánna",
-       "exif-pixelydimension": "Leithead bailí don íomhá",
-       "exif-pixelxdimension": "Airde bailí don íomhá",
+       "exif-pixelxdimension": "Leithead bailí don íomhá",
+       "exif-pixelydimension": "Airde bailí don íomhá",
        "exif-usercomment": "Nótaí an úsáideora",
        "exif-relatedsoundfile": "comhad gaolmhara fuaime",
        "exif-datetimeoriginal": "Dáta agus am ghiniúint na sonraí",
index 10a15b7..1b46daa 100644 (file)
        "exif-colorspace": "颜色空间",
        "exif-componentsconfiguration": "每部分𠮶意思",
        "exif-compressedbitsperpixel": "图像压缩模式",
-       "exif-pixelydimension": "有效图像𠮶阔",
-       "exif-pixelxdimension": "有效图像𠮶高",
+       "exif-pixelxdimension": "有效图像𠮶阔",
+       "exif-pixelydimension": "有效图像𠮶高",
        "exif-usercomment": "用户摘要",
        "exif-relatedsoundfile": "相关𠮶声气资料",
        "exif-datetimeoriginal": "资料创作时间",
index 3894997..01edb80 100644 (file)
        "exif-colorspace": "顏色空間",
        "exif-componentsconfiguration": "每部分嗰意思",
        "exif-compressedbitsperpixel": "圖像壓縮模式",
-       "exif-pixelydimension": "有效圖像嗰闊",
-       "exif-pixelxdimension": "有效圖像嗰高",
+       "exif-pixelxdimension": "有效圖像嗰闊",
+       "exif-pixelydimension": "有效圖像嗰高",
        "exif-usercomment": "用戶摘要",
        "exif-relatedsoundfile": "相關嗰聲氣資料",
        "exif-datetimeoriginal": "資料創作時間",
index 1bb1745..005e01c 100644 (file)
        "exif-colorspace": "Spàs datha",
        "exif-componentsconfiguration": "Ciall aig gach co-phàirt",
        "exif-compressedbitsperpixel": "Modh dùmhlachd-bhreacaidh an deilbh",
-       "exif-pixelydimension": "Leud an deilbh",
-       "exif-pixelxdimension": "Àirde an deilbh",
+       "exif-pixelxdimension": "Leud an deilbh",
+       "exif-pixelydimension": "Àirde an deilbh",
        "exif-usercomment": "Beachdan nan cleachdaichean",
        "exif-relatedsoundfile": "Faidhle fuaime co-cheangailte ris",
        "exif-datetimeoriginal": "Ceann-là 's àm a chaidh an dàta a chruthachadh",
index 15e0175..84dd8e7 100644 (file)
        "exif-colorspace": "Espazo de cor",
        "exif-componentsconfiguration": "Significado de cada compoñente",
        "exif-compressedbitsperpixel": "Modo de compresión da imaxe",
-       "exif-pixelydimension": "Ancho da imaxe",
-       "exif-pixelxdimension": "Altura da imaxe",
+       "exif-pixelxdimension": "Ancho da imaxe",
+       "exif-pixelydimension": "Altura da imaxe",
        "exif-usercomment": "Comentarios do usuario",
        "exif-relatedsoundfile": "Ficheiro de son relacionado",
        "exif-datetimeoriginal": "Data e hora de xeración do ficheiro",
        "redirect-not-exists": "Non se atopou o valor",
        "fileduplicatesearch": "Procurar ficheiros duplicados",
        "fileduplicatesearch-summary": "Procurar ficheiros duplicados a partir do valor de <i>hash</i> (un mecanismo de comprobación).",
-       "fileduplicatesearch-legend": "Procurar un duplicado",
        "fileduplicatesearch-filename": "Nome do ficheiro:",
        "fileduplicatesearch-submit": "Procurar",
        "fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamaño do ficheiro: $3<br />Tipo MIME: $4",
index d3b1f94..c8b9e13 100644 (file)
        "exif-colorspace": "Χρωματικὸς χῶρος",
        "exif-componentsconfiguration": "Νόημα ἑκάστης συνιστώσης",
        "exif-compressedbitsperpixel": "Τρόπος συμπιέσεως εἰκόνος",
-       "exif-pixelydimension": "Πλάτος εἰκόνος",
-       "exif-pixelxdimension": "Ὕψος εἰκόνος",
+       "exif-pixelxdimension": "Πλάτος εἰκόνος",
+       "exif-pixelydimension": "Ὕψος εἰκόνος",
        "exif-usercomment": "Σχόλια χρωμένου",
        "exif-relatedsoundfile": "Σχετιζόμενον ἀρχεῖον ἤχου",
        "exif-datetimeoriginal": "Χρονολογία καὶ ὥρα παραγωγῆς δεδομένων",
index 6a82cac..7565155 100644 (file)
        "exif-colorspace": "Farbruum",
        "exif-componentsconfiguration": "Bedytig vu einzelne Komponente",
        "exif-compressedbitsperpixel": "Komprimierti Bit pro Pixel",
-       "exif-pixelydimension": "Bildbreiti",
-       "exif-pixelxdimension": "Bildhechi",
+       "exif-pixelxdimension": "Bildbreiti",
+       "exif-pixelydimension": "Bildhechi",
        "exif-usercomment": "Benutzerkommentar",
        "exif-relatedsoundfile": "Zuegherigi Tondatei",
        "exif-datetimeoriginal": "Erfassigszytpunkt",
index 804c4f9..05778ce 100644 (file)
        "exif-colorspace": "રંગ માટે જગ્યા",
        "exif-componentsconfiguration": "દરેક ભાગનો અર્થ",
        "exif-compressedbitsperpixel": "ચિત્ર સરખામણી મોડ",
-       "exif-pixelydimension": "ચિત્ર પહોળાઇ",
-       "exif-pixelxdimension": "ચિત્રની ઊઁચાઈ",
+       "exif-pixelxdimension": "ચિત્ર પહોળાઇ",
+       "exif-pixelydimension": "ચિત્રની ઊઁચાઈ",
        "exif-usercomment": "સભ્યની ટિપ્પણી",
        "exif-relatedsoundfile": "સંબંધિત શ્રાવ્ય ફાઈલો",
        "exif-datetimeoriginal": "નિર્મિતીનો સમય અને તારીખ",
index 60bbaab..01b7d0a 100644 (file)
        "actionthrottled": "הפעולה הוגבלה",
        "actionthrottledtext": "כאמצעי נגד שימוש לרעה, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
-       "viewsourcetext": "×\91×\90פשר×\95ת×\9a לצפות בטקסט המקור של הדף ולהעתיקו.",
+       "viewsourcetext": "×\91×\90פשר×\95ת×\9b×\9d לצפות בטקסט המקור של הדף ולהעתיקו.",
        "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
        "protectedinterface": "דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה באתר ויקי זה, ומוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
        "editinginterface": "<strong>אזהרה:</strong> הדף שאתם עורכים הוא אחד הדפים המספקים הודעות מערכת לתוכנה.\nשינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר ויקי זה.",
        "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
        "virus-scanfailed": "הסריקה נכשלה (קוד: $1)",
        "virus-unknownscanner": "אנטי־וירוס בלתי ידוע:",
-       "logouttext": "'''יצאתם זה עתה מהחשבון.'''\n\nשימו לב כי ייתכן שדפים אחדים ימשיכו להיות מוצגים כאילו אתם עדיין מחוברים לחשבון עד שתנקו את המטמון של הדפדפן שלכם.",
+       "logouttext": "<strong>יצאתם זה עתה מהחשבון.</strong>\n\nשימו לב כי ייתכן שדפים אחדים ימשיכו להיות מוצגים כאילו אתם עדיין מחוברים לחשבון עד שתנקו את המטמון של הדפדפן שלכם.",
        "cannotlogoutnow-title": "לא ניתן לצאת מהחשבון עכשיו",
        "cannotlogoutnow-text": "היציאה אינה אפשרית בעת שימוש ב{{GRAMMAR:תחילית|$1}}.",
        "welcomeuser": "ברוך בואך, $1!",
        "noarticletext": "אין כרגע טקסט בדף הזה.\nבאפשרותכם [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
        "noarticletext-nopermission": "אין כרגע טקסט בדף הזה.\nבאפשרותכם [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\nאו <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים]</span>,\nאך אינכם מורשים ליצור את הדף.",
        "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בדקו אם ברצונכם ליצור/לערוך דף זה.",
+       "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בִּדקו אם ברצונכם ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שתצטרכו לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> לחצו והחזיקו את המקש <em>Shift</em> בעת לחיצתכם על <strong>טעינה מחדש</strong> (Reload), או לחצו על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em>&rlm; (<em><span dir=\"ltr\">⌘-R</span></em> במחשב מק)\n* <strong>גוגל כרום:</strong> לחצו על צירוף המקשים <em>Ctrl-Shift-R</em>&rlm; (<em><span dir=\"ltr\">⌘-Shift-R</span></em> במחשב מק)\n* <strong>אינטרנט אקספלורר:</strong> לחצו והחזיקו את המקש <em>Ctrl</em> בעת לחיצתכם על <strong>רענן</strong> (Refresh), או לחצו על צירוף המקשים <em>Ctrl-F5</em>\n* <strong>אופרה:</strong> נקו את המטמון ב־<em>Tools‏ ← Preferences</em>",
-       "usercssyoucanpreview": "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
-       "userjsyoucanpreview": "'''עצה:''' השתמשו בלחצן \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
-       "usercsspreview": "'''זכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.'''\n'''הוא טרם נשמר!'''",
-       "userjspreview": "'''זכרו שזו רק בדיקה/תצוגה מקדימה של סקריפט ה־JavaScript שלכם.'''\n'''הוא טרם נשמר!'''",
+       "usercssyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
+       "userjsyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את תסריט ה־JavaScript החדש שלכם לפני השמירה.",
+       "usercsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.\nהוא עדיין לא נשמר!</strong>",
+       "userjspreview": "<strong>זִכרו שזו רק בדיקה/תצוגה מקדימה של תסריט ה־JavaScript שלכם.\nהוא עדיין לא נשמר!</strong>",
        "sitecsspreview": "'''זכרו שזו רק תצוגה מקדימה של גיליון ה־CSS הזה.'''\n'''הוא טרם נשמר!'''",
        "sitejspreview": "'''זכרו שזו רק תצוגה מקדימה של קוד ה־JavaScript הזה.'''\n'''הוא טרם נשמר!'''",
        "userinvalidcssjstitle": "'''אזהרה:''' העיצוב \"$1\" אינו קיים.\nדפי .css ו־.js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
        "revdelete-success": "מצב התצוגה של הגרסה שׁוּנה.",
        "revdelete-failure": "לא ניתן היה לשנות את מצב התצוגה של הגרסה:\n$1",
        "logdelete-success": "מצב התצוגה של פעולת היומן שׁוּנה.",
-       "logdelete-failure": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9cשנ×\95ת ×\90ת ×\9eצ×\91 ×\94תצ×\95×\92×\94 ×©×\9c ×¤×¢×\95×\9cת ×\94×\99×\95×\9e×\9f:\n$1",
+       "logdelete-failure": "לא ניתן היה לשנות את מצב התצוגה של היומן:\n$1",
        "revdel-restore": "שינוי מצב התצוגה",
        "pagehist": "היסטוריית הדף",
        "deletedhist": "הגרסאות המחוקות",
        "revdelete-show-no-access": "שגיאה בהצגת הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
        "revdelete-modify-no-access": "שגיאה בשינוי הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לכם גישה אליו.",
        "revdelete-modify-missing": "שגיאה בשינוי פריט מספר $1: הוא אינו נמצא בבסיס הנתונים!",
-       "revdelete-no-change": "<strong>×\90×\96×\94ר×\94:</strong> ×\9cפר×\99×\98 ×\9eÖ¾$2, $1 ×\9b×\91ר ×\94×\99×\95 ×\90ת ×\94×\92×\93ר×\95ת ×\94תצ×\95×\92×\94 ×©×\91×\99קשת.",
+       "revdelete-no-change": "<strong>אזהרה:</strong> לפריט מ־$2, $1 כבר היו הגדרות התצוגה שביקשת.",
        "revdelete-concurrent-change": "שגיאה בשינוי הפריט מתאריך $2, $1: נראה שמצבו שונה על־ידי מישהו אחר בזמן שאתם ניסיתם לשנות אותו.\nאנא בדקו ביומנים.",
        "revdelete-only-restricted": "שגיאה בהסתרת הפריט מתאריך $2, $1: אין באפשרותך להעלים פריטים ממפעילי המערכת מבלי לבחור גם באחת מאפשרויות הנראוּת האחרות.",
        "revdelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** תקציר עריכה או מידע אישי לא הולמים\n** שם משתמש לא הולם\n** מידע שעלול להיות לשון הרע",
        "userrights-notallowed": "אין לך הרשאה להוסיף או להסיר הרשאות של משתמשים.",
        "userrights-changeable-col": "קבוצות שבאפשרותכם לשנות",
        "userrights-unchangeable-col": "קבוצות שאין באפשרותכם לשנות",
-       "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בדקו את השינויים שלכם ואשרו אותם.",
+       "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
        "userrights-removed-self": "הסרת את הרשאות המשתמש של עצמך. לכן אין לך כעת אפשרות לגשת לדף זה.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
        "filedelete": "מחיקת $1",
        "filedelete-legend": "מחיקת קובץ",
-       "filedelete-intro": "אתם עומדים למחוק את הקובץ '''[[Media:$1|$1]]''' יחד עם כל ההיסטוריה שלו.",
+       "filedelete-intro": "אתם עומדים למחוק את הקובץ <strong>[[Media:$1|$1]]</strong> יחד עם כל היסטוריית הגרסאות שלו.",
        "filedelete-intro-old": "אתם מוחקים את הגרסה של '''[[Media:$1|$1]]''' מ־[$4 $3, $2].",
        "filedelete-comment": "סיבה:",
        "filedelete-submit": "מחיקה",
        "emailpagetext": "ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.\nכתובת הדואר האלקטרוני שכתבת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
        "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
-       "usermaildisabledtext": "×\90×\99× ×\9b×\9d ×¨×©×\90ים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
+       "usermaildisabledtext": "×\90×\99× ×\9b×\9d ×\9e×\95רשים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
        "noemailtitle": "אין כתובת דואר אלקטרוני",
        "noemailtext": "משתמש זה לא הזין כתובת דואר אלקטרוני תקינה.",
        "nowikiemailtext": "משתמש זה בחר שלא לקבל דואר אלקטרוני ממשתמשים אחרים.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
-       "mywatchlist": "רשימת מעקב",
+       "mywatchlist": "רש×\99×\9eת ×\94×\9eעק×\91",
        "watchlistfor2": "עבור $1 $2",
        "nowatchlist": "אין דפים ברשימת המעקב.",
        "watchlistanontext": "נדרשת כניסה לחשבון כדי לצפות או לערוך פריטים ברשימת המעקב.",
        "wlshowhidemine": "עריכות שלי",
        "wlshowhidecategorization": "סיווג דפים לקטגוריות",
        "watchlist-options": "אפשרויות ברשימת המעקב",
-       "watching": "בהוספה לרשימת המעקב",
-       "unwatching": "בהסרה מרשימת המעקב",
+       "watching": "בהוספה לרשימת המעקב...",
+       "unwatching": "בהסרה מרשימת המעקב...",
        "watcherrortext": "אירעה שגיאה בעת שינוי הגדרות רשימת המעקב של \"$1\".",
        "enotif_reset": "סימון כל הדפים כאילו נצפו",
        "enotif_impersonal_salutation": "משתמש ב{{GRAMMAR:תחילית|{{SITENAME}}}}",
        "undelete-search-prefix": "הצגת דפים החל מ:",
        "undelete-search-submit": "חיפוש",
        "undelete-no-results": "לא נמצאו דפים תואמים בארכיון המחיקות.",
-       "undelete-filename-mismatch": "ש×\97×\96×\95ר ×\92רסת ×\94ק×\95×\91×¥ ×\9e×\94ת×\90ר×\99×\9a $1 × ×\9bש×\9c: ×©×\9d ×§×\95×\91×¥ ×\9c×\90 ×ª×\95×\90×\9d",
-       "undelete-bad-store-key": "ש×\97×\96×\95ר ×\92רסת ×\94ק×\95×\91×¥ ×\9e×\94ת×\90ר×\99×\9a $1 × ×\9bש×\9c: הקובץ היה חסר לפני המחיקה.",
+       "undelete-filename-mismatch": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\92רסת ×\94ק×\95×\91×¥ ×\9eÖ¾$1: ×©×\9d ×\94ק×\95×\91×¥ ×\9c×\90 ×ª×\95×\90×\9d.",
+       "undelete-bad-store-key": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\92רסת ×\94ק×\95×\91×¥ ×\9eÖ¾$1: הקובץ היה חסר לפני המחיקה.",
        "undelete-cleanup-error": "שגיאת בעת מחיקת קובץ הארכיון \"$1\" שאינו בשימוש.",
        "undelete-missing-filearchive": "שחזור קובץ הארכיון שמספרו $1 נכשל כיוון שהוא אינו בבסיס הנתונים. ייתכן שהוא כבר שוחזר.",
        "undelete-error": "שגיאה בשחזור דף",
        "whatlinkshere-submit": "הצגה",
        "autoblockid": "חסימה אוטומטית #$1",
        "block": "חסימת משתמש",
-       "unblock": "שחרור משתמש",
+       "unblock": "ש×\97ר×\95ר ×\97ס×\99×\9e×\94 ×©×\9c ×\9eשת×\9eש",
        "blockip": "חסימת {{GENDER:$1|משתמש|משתמשת}}",
        "blockip-legend": "חסימת משתמש",
        "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).\nבאפשרותכם לחסום טווחי כתובות IP באמצעות תחביר [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; הטווח הגדול ביותר שניתן לחסום הוא <span dir=\"ltr\">/$1</span> עבור IPv4 ו־<span dir=\"ltr\">/$2</span> עבור IPv6.",
        "blocklogentry": "חסם את [[$1]] למשך $2 $3",
        "reblock-logentry": "שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3",
        "blocklogtext": "זהו יומן פעולות החסימה והשחרור של משתמשים.\nכתובות IP שנחסמו אוטומטית אינן מופיעות.\nראו גם את [[Special:BlockList|רשימת החסומים]] לרשימה של החרמות וחסימות פעילות כעת.",
-       "unblocklogentry": "שחרר את $1",
+       "unblocklogentry": "שחרר את החסימה של $1",
        "block-log-flags-anononly": "משתמשים אנונימיים בלבד",
        "block-log-flags-nocreate": "יצירת חשבונות נחסמה",
        "block-log-flags-noautoblock": "חסימה אוטומטית מבוטלת",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
        "ipb-needreblock": "$1 כבר נחסם. האם ברצונך לשנות את הגדרות החסימה?",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
-       "unblock-hideuser": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97רר ×\9eשת×\9eש זה, כיוון ששם המשתמש שלו הוסתר.",
+       "unblock-hideuser": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cש×\97רר ×\90ת ×\94×\97ס×\99×\9e×\94 ×©×\9c ×\94×\9eשת×\9eש ×\94זה, כיוון ששם המשתמש שלו הוסתר.",
        "ipb_cant_unblock": "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
        "ipb_blocked_as_range": "שגיאה: כתובת ה־IP $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה. עם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.",
        "ip_range_invalid": "טווח IP שגוי.",
        "lockdb": "נעילת בסיס נתונים",
        "unlockdb": "שחרור בסיס נתונים",
        "lockdbtext": "נעילת בסיס הנתונים תמנע ממשתמשים את האפשרות לערוך דפים, לשנות את העדפותיהם, לערוך את רשימות המעקב שלהם, ופעולות אחרות הדורשות ביצוע שינויים בבסיס הנתונים.\n\nאנא אשרו שזה מה שאתם מתכוונים לעשות, ושתשחררו את בסיס הנתונים מנעילה כאשר פעולת התחזוקה תסתיים.",
-       "unlockdbtext": "ש×\97ר×\95ר ×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×\9e× ×¢×\99×\9c×\94 ×\99×\97×\96×\99ר ×\9c×\9eשת×\9eש×\99×\9d ×\90ת ×\94×\99×\9b×\95×\9cת ×\9cער×\95×\9a ×\93פ×\99×\9d, ×\9cשנ×\95ת ×\90ת ×\94×¢×\93פ×\95ת×\99×\94×\9d, ×\9cער×\95×\9a ×\90ת ×¨×©×\99×\9e×\95ת ×\94×\9eעק×\91 ×©×\9c×\94×\9d, ×\95×\9c×\91צע ×¤×¢×\95×\9c×\95ת ×\90×\97ר×\95ת ×\94×\93×\95רש×\95ת ×\91×\99צ×\95×¢ ×©×\99× ×\95×\99×\99×\9d ×\91×\91ס×\99ס ×\94נת×\95× ×\99×\9d\n×\90× ×\90 ×\90שר×\95 ×©×\96×\94 ×\9e×\94 ×©×\91×\9b×\95×\95נתכם לעשות.",
+       "unlockdbtext": "ש×\97ר×\95ר ×\91ס×\99ס ×\94נת×\95× ×\99×\9d ×\9e× ×¢×\99×\9c×\94 ×\99×\97×\96×\99ר ×\9c×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×\90ת ×\94×\99×\9b×\95×\9cת ×\9cער×\95×\9a ×\93פ×\99×\9d, ×\9cשנ×\95ת ×\90ת ×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×©×\9c×\94×\9d, ×\9cער×\95×\9a ×\90ת ×¨×©×\99×\9e×\95ת ×\94×\9eעק×\91 ×©×\9c×\94×\9d, ×\95×\9c×\91צע ×¤×¢×\95×\9c×\95ת ×\90×\97ר×\95ת ×\94×\93×\95רש×\95ת ×\91×\99צ×\95×¢ ×©×\99× ×\95×\99×\99×\9d ×\91×\91ס×\99ס ×\94נת×\95× ×\99×\9d.\n×\90× ×\90 ×\90שר×\95 ×©×\96×\94 ×\9e×\94 ×\90×\9b×\9f ×\9e×\94 ×©×\91רצ×\95× כם לעשות.",
        "lockconfirm": "כן, ברצוני לנעול את בסיס הנתונים.",
        "unlockconfirm": "כן, ברצוני לשחרר את בסיס הנתונים מנעילה.",
        "lockbtn": "נעילת בסיס הנתונים",
        "tooltip-pt-watchlist": "רשימת הדפים שאתם עוקבים אחרי השינויים בהם",
        "tooltip-pt-mycontris": "רשימת התרומות שלך",
        "tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
-       "tooltip-pt-login": "×\9e×\95×\9e×\9c×¥ ×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f; ×¢×\9d ×\96×\90ת, ×\96×\94 ×\9c×\90 ×\97×\95×\91×\94",
+       "tooltip-pt-login": "×\9e×\95×\9e×\9c×¥ ×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f; ×¢×\9d ×\96×\90ת, ×\90×\99×\9f ×\97×\95×\91×\94 ×\9cעש×\95ת ×\96×\90ת",
        "tooltip-pt-logout": "יציאה מהחשבון",
-       "tooltip-pt-createaccount": "×\9e×\95×\9e×\9c×¥ ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95; ×¢×\9d ×\96×\90ת, ×\96×\94 ×\9c×\90 ×\97×\95×\91×\94",
+       "tooltip-pt-createaccount": "×\9e×\95×\9e×\9c×¥ ×\9c×\99צ×\95ר ×\97ש×\91×\95×\9f ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95; ×¢×\9d ×\96×\90ת, ×\90×\99×\9f ×\97×\95×\91×\94 ×\9cעש×\95ת ×\96×\90ת",
        "tooltip-ca-talk": "שיחה על דף זה",
        "tooltip-ca-edit": "עריכת דף זה באמצעות קוד ויקי",
        "tooltip-ca-addsection": "הוספת פסקה חדשה",
        "file-no-thumb-animation-gif": "'''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של תמונות GIF בעלות רזולוציה גבוהה כמו זאת לא תהיינה מונפשות.'''",
        "newimages": "גלריית קבצים חדשים",
        "imagelisttext": "להלן רשימה של {{PLURAL:$1|קובץ אחד|$1 קבצים}}, ממוינים $2:",
-       "newimages-summary": "דף זה מציג את הקבצים האחרונים שהועלו.",
+       "newimages-summary": "×\93×£ ×\9e×\99×\95×\97×\93 ×\96×\94 ×\9eצ×\99×\92 ×\90ת ×\94ק×\91צ×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×©×\94×\95×¢×\9c×\95.",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
        "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "exif-colorspace": "מרחב הצבע",
        "exif-componentsconfiguration": "משמעות כל רכיב",
        "exif-compressedbitsperpixel": "שיטת דחיסת התמונה",
-       "exif-pixelydimension": "רוחב התמונה הנכון",
-       "exif-pixelxdimension": "גובה התמונה הנכון",
+       "exif-pixelxdimension": "רוחב התמונה הנכון",
+       "exif-pixelydimension": "גובה התמונה הנכון",
        "exif-usercomment": "הערות המשתמש",
        "exif-relatedsoundfile": "קובץ שמע מקושר",
        "exif-datetimeoriginal": "התאריך והשעה של יצירת הקובץ",
        "watchlistedit-raw-done": "רשימת המעקב עודכנה.",
        "watchlistedit-raw-added": "{{PLURAL:$1|כותרת אחת נוספה|$1 כותרות נוספו}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
-       "watchlistedit-clear-title": "רש×\99×\9eת ×\94×\9eעק×\91 × ×\9e×\97ק×\94",
+       "watchlistedit-clear-title": "× ×\99ק×\95×\99 ×¨×©×\99×\9eת ×\94×\9eעק×\91",
        "watchlistedit-clear-legend": "ניקוי רשימת המעקב",
-       "watchlistedit-clear-explain": "×\9b×\9c ×\94×\9b×\95תר×\95ת ×©×\9c ×\94×\93פ×\99×\9d ×©×\99×\95סר×\95 ×\9eרש×\99×\9eת ×\94×\9eעק×\91",
+       "watchlistedit-clear-explain": "×\9b×\9c ×\94×\93פ×\99×\9d ×\99×\95סר×\95 ×\9eרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a",
        "watchlistedit-clear-titles": "כותרות:",
        "watchlistedit-clear-submit": "ניקוי רשימת המעקב (לצמיתות!)",
        "watchlistedit-clear-done": "רשימת המעקב שלך נוקתה.",
        "redirect-not-exists": "הערך לא נמצא",
        "fileduplicatesearch": "חיפוש קבצים כפולים",
        "fileduplicatesearch-summary": "חיפוש קבצים כפולים על בסיס ערכי הגיבוב שלהם.",
-       "fileduplicatesearch-legend": "חיפוש קבצים כפולים",
        "fileduplicatesearch-filename": "קובץ:",
        "fileduplicatesearch-submit": "חיפוש",
        "fileduplicatesearch-info": "<span dir=\"ltr\">$1 × $2</span> פיקסלים<br />גודל הקובץ: $3<br />סוג MIME‏: $4",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
        "sessionprovider-nocookies": "ייתכן שאפשרות השימוש בעוגיות כבויה. יש לוודא שאפשרות השימוש בעוגיות מופעלת ולהתחיל מחדש.",
        "randomrootpage": "דף שורש אקראי",
-       "log-action-filter-block": "ס×\95×\92 ×\94×\97ס×\99×\9e×\95ת:",
-       "log-action-filter-delete": "ס×\95×\92 ×\94×\9e×\97×\99ק×\95ת:",
+       "log-action-filter-block": "ס×\95×\92 ×\94×\97ס×\99×\9e×\94:",
+       "log-action-filter-delete": "ס×\95×\92 ×\94×\9e×\97×\99ק×\94:",
        "log-action-filter-patrol": "סוג השינויים הבדוקים:",
        "log-action-filter-protect": "סוג ההגנות:",
        "log-action-filter-upload": "סוג ההעלאות:",
        "log-action-filter-all": "הכול",
-       "log-action-filter-block-block": "×\97ס×\99×\9e×\95ת",
-       "log-action-filter-block-reblock": "שינויי חסימה",
-       "log-action-filter-block-unblock": "שחרורי חסימה",
+       "log-action-filter-block-block": "×\97ס×\99×\9e×\94",
+       "log-action-filter-block-reblock": "שינוי חסימה",
+       "log-action-filter-block-unblock": "שחרור חסימה",
        "log-action-filter-delete-delete": "מחיקת דפים",
-       "log-action-filter-delete-restore": "שחזור דפים מחוקים",
+       "log-action-filter-delete-restore": "שחזור דפים",
        "log-action-filter-delete-event": "מחיקת פעולות יומן",
        "log-action-filter-delete-revision": "מחיקת גרסאות",
        "log-action-filter-patrol-patrol": "סימוניים ידניים כבדוק",
index c645b0c..a20bfe8 100644 (file)
        "exif-colorspace": "रंग स्थान",
        "exif-componentsconfiguration": "हर घटक का मतलब",
        "exif-compressedbitsperpixel": "चित्र कॉम्प्रेशन मोड",
-       "exif-pixelydimension": "छवि चौड़ाई",
-       "exif-pixelxdimension": "छवि ऊँचाई",
+       "exif-pixelxdimension": "छवि चौड़ाई",
+       "exif-pixelydimension": "छवि ऊँचाई",
        "exif-usercomment": "सदस्य टिप्पणी",
        "exif-relatedsoundfile": "संबंधित ध्वनी फ़ाईल",
        "exif-datetimeoriginal": "डाटा बनाने का दिनांक और समय",
        "redirect-not-exists": "यह मान प्राप्त नहीं हुआ",
        "fileduplicatesearch": "फ़ाईल द्विरावृत्ति खोजें",
        "fileduplicatesearch-summary": "हैश वैल्यू के अनुसार फ़ाईल की द्विरावृत्ति खोजें।",
-       "fileduplicatesearch-legend": "द्विरावृत्ति के लिये खोजें",
        "fileduplicatesearch-filename": "फ़ाईलनाम:",
        "fileduplicatesearch-submit": "खोजें",
        "fileduplicatesearch-info": "$1 × $2 पीक्सेल<br />फ़ाईल का आकार: $3<br />MIME प्रकार: $4",
index e18aa14..e393e09 100644 (file)
        "exif-colorspace": "Rang ke jagha",
        "exif-componentsconfiguration": "Har ek component ke matlab",
        "exif-compressedbitsperpixel": "Chapa ke compression mode",
-       "exif-pixelydimension": "Chaapa ke thiik chaurrai",
-       "exif-pixelxdimension": "Chaapa ke thiik uunchai",
+       "exif-pixelxdimension": "Chaapa ke thiik chaurrai",
+       "exif-pixelydimension": "Chaapa ke thiik uunchai",
        "exif-usercomment": "Sadasysa ke bichar",
        "exif-relatedsoundfile": "Saathe waala awaaj waala file",
        "exif-datetimeoriginal": "Data generation ke tarik aur time",
index dbe4fcb..172ada9 100644 (file)
        "newarticle": "(Novo)",
        "newarticletext": "Došli ste na stranicu koja još ne postoji.\nAko želite stvoriti tu stranicu, počnite tipkati u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovamo dospjeli slučajno, kliknite gumb '''natrag''' (back) u svom pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor s neprijavljenim suradnikom koji još nije otvorio suradnički račun ili se njime ne koristi. Zbog toga se moramo služiti brojčanom IP adresom kako bismo ga identificirali. Takvu adresu često može dijeliti više ljudi. Ako ste neprijavljeni suradnik i smatrate da su Vam upućeni irelevantni komentari, molimo Vas da [[Special:UserLogin/signup|otvorite suradnički račun]] ili [[Special:UserLogin|se prijavite]] te tako u budućnosti izbjegnete zamjenu s drugim neprijavljenim suradnicima.''",
-       "noarticletext": "Na ovoj stranici trenutačno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane evidencije]\nili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.",
+       "noarticletext": "Na ovoj stranici trenutačno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane evidencije]\nili [{{fullurl:{{FULLPAGENAME}}|action=edit}} stvoriti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Ova stranica nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane evidencije]</span>, ali ne možete stvoriti ovu stranicu.",
        "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo je obično uzrokovano kada kliknete na zastarjelu poveznicu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "userpage-userdoesnotexist": "Suradničko ime \"<nowiki>$1</nowiki>\" nije prijavljeno. Jeste li sigurni da želite stvoriti/uređivati ovu stranicu?",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|promjena|promjene|promjena}} od $2",
        "javascripttest": "Testiranje JavaScripta",
-       "javascripttest-pagetext-noframework": "Ova je stranica rezervirana za izvršavanje JavaScript testova.",
-       "javascripttest-pagetext-unknownframework": "Nepoznata testna okolina \"$1\".",
-       "javascripttest-pagetext-frameworks": "Molimo izaberite jednu od sljedećih testnih okolina: $1",
-       "javascripttest-pagetext-skins": "Izaberite temu (''skin'') za testiranje:",
        "javascripttest-qunit-intro": "Pogledajte [$1 testnu dokumentaciju] na mediawiki.org.",
        "tooltip-pt-userpage": "Stranica suradnika {{GENDER:|Your user}}",
        "tooltip-pt-anonuserpage": "Suradnička stranica za IP adresu pod kojom uređujete",
-       "tooltip-pt-mytalk": "Moja stranica za razgovor",
+       "tooltip-pt-mytalk": "Vaša stranica za razgovor",
        "tooltip-pt-anontalk": "Razgovor o suradnicima s ove IP adrese",
        "tooltip-pt-preferences": "Vaše postavke",
        "tooltip-pt-watchlist": "Popis stranica koje pratite.",
-       "tooltip-pt-mycontris": "Popis mojih doprinosa",
+       "tooltip-pt-mycontris": "Popis Vaših doprinosa",
        "tooltip-pt-login": "Predlažemo Vam da se prijavite, ali nije obvezno.",
        "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Nudimo vam mogućnost da napravite račun i prijavite se, iako to nije nužno.",
        "exif-colorspace": "Kolor prostor",
        "exif-componentsconfiguration": "Značenje pojedinih komponenti",
        "exif-compressedbitsperpixel": "Dubina boje poslije sažimanja",
-       "exif-pixelydimension": "Važeća širina slike",
-       "exif-pixelxdimension": "Važeća visina slike",
+       "exif-pixelxdimension": "Važeća širina slike",
+       "exif-pixelydimension": "Važeća visina slike",
        "exif-usercomment": "Suradnički komentar",
        "exif-relatedsoundfile": "Povezani zvučni zapis",
        "exif-datetimeoriginal": "Datum i vrijeme slikanja",
        "redirect-file": "Datotečno ime",
        "fileduplicatesearch": "Traži kopije datoteka",
        "fileduplicatesearch-summary": "Traži kopije datoteka na temelju njihove hash vrijednosti.",
-       "fileduplicatesearch-legend": "Traži kopije datoteka",
        "fileduplicatesearch-filename": "Ime datoteke:",
        "fileduplicatesearch-submit": "Traži",
        "fileduplicatesearch-info": "$1 × $2 piksela<br />Veličina datoteke: $3<br />MIME tip: $4",
index 160e2b6..f9e8744 100644 (file)
        "exif-colorspace": "Farrebraum",
        "exif-componentsconfiguration": "Bedeitung einzelner Komponente",
        "exif-compressedbitsperpixel": "Komprimierte Bits por Pixel",
-       "exif-pixelydimension": "Bildbreit",
-       "exif-pixelxdimension": "Bildhöch",
+       "exif-pixelxdimension": "Bildbreit",
+       "exif-pixelydimension": "Bildhöch",
        "exif-usercomment": "Benutzerkommentare",
        "exif-relatedsoundfile": "Zugehöriche Tondatei",
        "exif-datetimeoriginal": "Erfassungszeitpunkt",
index 6e8b482..ef601ec 100644 (file)
        "exif-colorspace": "Barbny rum",
        "exif-componentsconfiguration": "Woznam kóždeje komponenty",
        "exif-compressedbitsperpixel": "Modus wobrazoweje kompresije",
-       "exif-pixelydimension": "Šěrokosć wobraza",
-       "exif-pixelxdimension": "Wysokosć wobraza",
+       "exif-pixelxdimension": "Šěrokosć wobraza",
+       "exif-pixelydimension": "Wysokosć wobraza",
        "exif-usercomment": "Přispomjenja wužiwarja",
        "exif-relatedsoundfile": "Zwjazana zynkowa dataja",
        "exif-datetimeoriginal": "Datum a čas wutworjenja datow",
index 36bd896..f5679bf 100644 (file)
        "exif-colorspace": "Színtér",
        "exif-componentsconfiguration": "Az egyes összetevők jelentése",
        "exif-compressedbitsperpixel": "Képtömörítési mód",
-       "exif-pixelydimension": "Képszélesség",
-       "exif-pixelxdimension": "Képmagasság",
+       "exif-pixelxdimension": "Képszélesség",
+       "exif-pixelydimension": "Képmagasság",
        "exif-usercomment": "Felhasználók megjegyzései",
        "exif-relatedsoundfile": "Kapcsolódó hangfájl",
        "exif-datetimeoriginal": "EXIF információ létrehozásának dátuma",
        "redirect-not-exists": "Érték nem található",
        "fileduplicatesearch": "Duplikátumok keresése",
        "fileduplicatesearch-summary": "Fájlok duplikátumainak keresése hash értékük alapján.",
-       "fileduplicatesearch-legend": "Duplikátum keresése",
        "fileduplicatesearch-filename": "Fájlnév:",
        "fileduplicatesearch-submit": "Keresés",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Fájlméret: $3<br />MIME-típus: $4",
index c33e046..eab02cc 100644 (file)
        "exif-colorspace": "Spatio de colores",
        "exif-componentsconfiguration": "Significato de cata componente",
        "exif-compressedbitsperpixel": "Modo de compression del imagine",
-       "exif-pixelydimension": "Latitude del imagine",
-       "exif-pixelxdimension": "Altitude del imagine",
+       "exif-pixelxdimension": "Latitude del imagine",
+       "exif-pixelydimension": "Altitude del imagine",
        "exif-usercomment": "Commentos del usator",
        "exif-relatedsoundfile": "File audio connexe",
        "exif-datetimeoriginal": "Data e hora del generation del datos",
        "redirect-not-exists": "Valor non trovate",
        "fileduplicatesearch": "Cercar files duplicate",
        "fileduplicatesearch-summary": "Cercar files duplicate a base de lor summas de verification ''(hash).''",
-       "fileduplicatesearch-legend": "Cercar un duplicato",
        "fileduplicatesearch-filename": "Nomine del file:",
        "fileduplicatesearch-submit": "Cercar",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Grandor del file: $3<br />Typo MIME: $4",
index c710172..3036682 100644 (file)
        "exif-colorspace": "Ruang warna",
        "exif-componentsconfiguration": "Arti tiap komponen",
        "exif-compressedbitsperpixel": "Mode kompresi gambar",
-       "exif-pixelydimension": "Lebar gambar",
-       "exif-pixelxdimension": "Tinggi gambar",
+       "exif-pixelxdimension": "Lebar gambar",
+       "exif-pixelydimension": "Tinggi gambar",
        "exif-usercomment": "Komentar pengguna",
        "exif-relatedsoundfile": "Berkas audio yang berhubungan",
        "exif-datetimeoriginal": "Tanggal dan waktu pembuatan data",
index c39fece..66eab0a 100644 (file)
        "exif-colorspace": "Espasio ti maris",
        "exif-componentsconfiguration": "Kaibuksilan iti tunggal maysa a komponente",
        "exif-compressedbitsperpixel": "Moda ti kompresion ti ladawan",
-       "exif-pixelydimension": "Kaakaba ti ladawan",
-       "exif-pixelxdimension": "Katayag ti ladawan",
+       "exif-pixelxdimension": "Kaakaba ti ladawan",
+       "exif-pixelydimension": "Katayag ti ladawan",
        "exif-usercomment": "Dagiti komentario ti agar-aramat",
        "exif-relatedsoundfile": "Mainaig a papeles ti audio",
        "exif-datetimeoriginal": "Petsa ken oras ti pannakaaramid ti datos",
index 24aaf0f..cb12531 100644 (file)
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
        "newarticletext": "Шо хьожаяргаца дехьадаьннад йоаца оагӀув тӀа.\nИз кхолларгьйолаш кӀалхагӀа доала корачу текст Iочуязаде (нагахьа кхетаде хала дале [$1 новкъосталан оагӀувага] хьажа).\nЦа ховш укхаза нийсденнадале, шоай браузера кнопка '''Юха''' тӀа пӀелга тоӀабе.",
-       "noarticletext": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ñ\8fздам Ð´Ð¾Ð°Ñ\86аÑ\88 Ð´Ð°.\n[[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ð´Ñ\83вÑ\86ам ÐºÐ¾Ñ\80аде]] ÐºÑ\85Ñ\8bдола Ð¹Ð¾Ð°Ð·Ñ\83ваÑ\88каÑ\85 Ð¹Ð¸Ð¹Ñ\88а Ñ\8f Ñ\88Ñ\83н, Ð²ÐµÑ\88Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82апÑ\82аÑ\80ий Ð¹Ð¾Ð°Ð·Ñ\83в ÐºÐ°Ñ\80ае], Ðµ\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Ó\80и Ð¹Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80Ñ\83в Ðµла]'''</span>.",
+       "noarticletext": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80Ñ\83в Ñ\82Ó\80а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86.\nШÑ\83н Ð°Ñ\8cÑ\82Ñ\82Ñ\83в Ð±Ð° [[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ñ\85Ñ\8cоаÑ\8fÑ\80 ÐºÐ¾Ñ\80аде]] ÐºÑ\85Ñ\8bйола Ð¹Ð¾Ð°Ð·Ñ\83ваÑ\88 Ñ\87Ñ\83, Ð¸Ñ\88Ñ\82Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82епÑ\82аÑ\80ий Ñ\8fздаÑ\8cÑ\80аÑ\88], Ðµ\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Ó\80и Ð¹Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80Ñ\83в ÐºÑ\85олла]'''</span>.",
        "noarticletext-nopermission": "ХIанз укх оагӀув тӀа яздам дац.\nШун йиш я, кхыдола йоазувнашках [[Special:Search/{{PAGENAME}}|дола цӀерий хаттам корае]] е <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийсамий тептара йоазувнаш корае].</span>",
        "note": "'''ХӀамоалар:'''",
        "previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
        "searchresults-title": "\"$1\" тохка",
        "notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
        "prevn": "{{PLURAL:$1|хьалхйоагlар $1|хьалхйоагlараш $1|хьалхйоагlараш $1}}",
-       "nextn": "{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}",
+       "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
        "nextn-title": "{{PLURAL:$1|1=$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}",
        "shown-title": "Хьóкха $1 {{PLURAL:$1|даь йоазо|даь йоазонаш}} укх оáгIувна тIа",
        "recentchanges-label-minor": "ЗIамига хувцам я",
        "recentchanges-label-bot": "Ер хувцам бIатаца яь е",
        "recentchanges-label-unpatrolled": "Ер хувцам ший моттиге кхы дIадехьаяьккхаяц.",
+       "recentchanges-label-plusminus": "байташкахь боарам хувцар",
+       "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIувнашка]])",
        "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
        "rclistfrom": "$3 $2 тIара хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига хувцамаш",
        "rcshowhideminor-hide": "Къайлдаккха",
        "rcshowhidebots": "$1 боташ",
        "rcshowhidebots-show": "Хьахьокха",
-       "rcshowhideliu": "Чубаьнначара дакъалаьцархочий $1",
+       "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
        "rcshowhideliu-hide": "Къайлдаккха",
        "rcshowhideanons": "$1 цIияьккханза дакъалаьцархой",
        "rcshowhideanons-show": "Хьахьокха",
        "undelete-search-submit": "Хьалáха",
        "namespace": "ЦIерий аренаш",
        "invert": "Хьаржар юхадаккха",
+       "namespace_association": "Ювзаенна мотт",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочунна}} къахьегам",
        "contributions-title": "$1 дакъалаьцархочунна къахьегам",
        "exif-imagedescription": "Сурта цIи",
        "exif-artist": "Яздархо",
        "exif-colorspace": "Басара аре",
-       "exif-pixelydimension": "Сурта шерал",
-       "exif-pixelxdimension": "Сурта лакхал",
+       "exif-pixelxdimension": "Сурта шерал",
+       "exif-pixelydimension": "Сурта лакхал",
        "exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
        "exif-writer": "Яздама да",
        "exif-languagecode": "Мотт",
index 9e0fd9f..6cc3b26 100644 (file)
        "exif-colorspace": "Litrýmd",
        "exif-componentsconfiguration": "Merking hverrar einingar",
        "exif-compressedbitsperpixel": "Aðferð við myndþjöppun",
-       "exif-pixelydimension": "Breidd myndar",
-       "exif-pixelxdimension": "Hæð myndar",
+       "exif-pixelxdimension": "Breidd myndar",
+       "exif-pixelydimension": "Hæð myndar",
        "exif-usercomment": "Athugunarsemdir notanda",
        "exif-relatedsoundfile": "Tengd hljóðskrá",
        "exif-datetimeoriginal": "Upprunaleg dagsetning",
index 270c002..c460df0 100644 (file)
        "exif-colorspace": "Spazio dei colori",
        "exif-componentsconfiguration": "Significato di ciascuna componente",
        "exif-compressedbitsperpixel": "Modalità di compressione immagine",
-       "exif-pixelydimension": "Larghezza immagine",
-       "exif-pixelxdimension": "Altezza immagine",
+       "exif-pixelxdimension": "Larghezza immagine",
+       "exif-pixelydimension": "Altezza immagine",
        "exif-usercomment": "Note dell'utente",
        "exif-relatedsoundfile": "File audio collegato",
        "exif-datetimeoriginal": "Data e ora di creazione dei dati",
        "redirect-not-exists": "Valore non trovato",
        "fileduplicatesearch": "Ricerca dei file duplicati",
        "fileduplicatesearch-summary": "Ricerca di eventuali duplicati del file in base al valore di ''hash''.",
-       "fileduplicatesearch-legend": "Ricerca di un duplicato",
        "fileduplicatesearch-filename": "Nome del file:",
        "fileduplicatesearch-submit": "Ricerca",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Dimensione del file: $3<br />Tipo MIME: $4",
index 3a07609..d1667fe 100644 (file)
        "exif-colorspace": "色空間情報",
        "exif-componentsconfiguration": "各コンポーネントの意味",
        "exif-compressedbitsperpixel": "画像圧縮モード",
-       "exif-pixelydimension": "実効画像の幅",
-       "exif-pixelxdimension": "実効画像の高さ",
+       "exif-pixelxdimension": "実効画像の幅",
+       "exif-pixelydimension": "実効画像の高さ",
        "exif-usercomment": "ユーザー コメント",
        "exif-relatedsoundfile": "関連音声ファイル",
        "exif-datetimeoriginal": "原画像データの生成日時",
        "redirect-not-exists": "値が見つかりません",
        "fileduplicatesearch": "重複ファイルの検索",
        "fileduplicatesearch-summary": "重複ファイルをハッシュ値に基づいて検索します。",
-       "fileduplicatesearch-legend": "重複の検索",
        "fileduplicatesearch-filename": "ファイル名:",
        "fileduplicatesearch-submit": "検索",
        "fileduplicatesearch-info": "$1 × $2 ピクセル<br />ファイルサイズ: $3<br />MIME タイプ: $4",
index 8a4924e..6b5ad53 100644 (file)
        "editfont-serif": "Aksara (font) Serif",
        "sunday": "Minggu",
        "monday": "Senèn",
-       "tuesday": "Slasa",
+       "tuesday": "Selasa",
        "wednesday": "Rebo",
        "thursday": "Kemis",
-       "friday": "Jemuwah",
+       "friday": "Jumuwah",
        "saturday": "Setu",
        "sun": "Min",
        "mon": "Sen",
        "tue": "Sel",
-       "wed": "Rab",
-       "thu": "Kam",
-       "fri": "Jem",
+       "wed": "Reb",
+       "thu": "Kem",
+       "fri": "Jum",
        "sat": "Set",
        "january": "Januari",
-       "february": "Fébruari",
+       "february": "Pébruari",
        "march": "Maret",
        "april": "April",
-       "may_long": "Méi",
+       "may_long": "Mèi",
        "june": "Juni",
        "july": "Juli",
        "august": "Agustus",
-       "september": "September",
+       "september": "Sèptèmber",
        "october": "Oktober",
-       "november": "November",
+       "november": "Nomber",
        "december": "Désèmber",
        "january-gen": "Januari",
-       "february-gen": "Fébruari",
+       "february-gen": "Fèbruari",
        "march-gen": "Maret",
        "april-gen": "April",
        "may-gen": "Méi",
        "june-gen": "Juni",
        "july-gen": "Juli",
        "august-gen": "Agustus",
-       "september-gen": "September",
+       "september-gen": "Sèptèmber",
        "october-gen": "Oktober",
-       "november-gen": "November",
+       "november-gen": "Nomber",
        "december-gen": "Désèmber",
        "jan": "Jan",
-       "feb": "Feb",
+       "feb": "b",
        "mar": "Mar",
        "apr": "Apr",
-       "may": "Méi",
+       "may": "Mèi",
        "jun": "Jun",
        "jul": "Jul",
        "aug": "Agu",
-       "sep": "Sep",
+       "sep": "Sèp",
        "oct": "Okt",
-       "nov": "Nov",
-       "dec": "Des",
+       "nov": "Nop",
+       "dec": "Dès",
        "january-date": "Januari $1",
        "february-date": "Februari $1",
        "march-date": "Maret $1",
        "november-date": "$1 Novèmber",
        "december-date": "$1 Dèsèmber",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
-       "category_header": "Artikel ing kategori \"$1\"",
+       "category_header": "Kaca sajeroning kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Média ing kategori \"$1\"",
        "category-empty": "''Kategori iki saiki ora ngandhut artikel utawa média.''",
        "mypage": "Kaca",
        "mytalk": "Wicara",
        "anontalk": "Dhiskusi IP puniki",
-       "navigation": "Pandhu Arah",
-       "and": "&#32;Lan",
+       "navigation": "Napigasi",
+       "and": "&#32;lan",
        "qbfind": "Golèk",
        "qbbrowse": "Navigasi",
        "qbedit": "Sunting",
        "faq": "FAQ (Pitakonan sing kerep diajokaké)",
        "faqpage": "Project:FAQ",
        "actions": "Tindakan",
-       "namespaces": "Ruang jeneng",
-       "variants": "Varian",
-       "navigation-heading": "Menu navigasi",
+       "namespaces": "Lowah aran",
+       "variants": "Parian",
+       "navigation-heading": "Menu napigasi",
        "errorpagetitle": "Kasalahan",
-       "returnto": "Bali menyang $1.",
+       "returnto": "Bali nyang $1.",
        "tagline": "Saka {{SITENAME}}",
        "help": "Pitulung",
-       "search": "Panggolèkan",
+       "search": "Golèk",
        "searchbutton": "Golèk",
        "go": "Nuju menyang",
-       "searcharticle": "Nuju menyang",
-       "history": "Vèrsi sadurungé",
+       "searcharticle": "Menyang",
+       "history": "Sajarah kaca",
        "history_short": "Vèrsi lawas",
        "updatedmarker": "diowahi wiwit kunjungan pungkasanku",
-       "printableversion": "Versi cithak",
+       "printableversion": "Cara cithakan",
        "permalink": "Pranala permanèn",
        "print": "Cithak",
        "view": "Pirsani",
-       "view-foreign": "Pirsani ing $1",
-       "edit": "Sunting",
+       "view-foreign": "Deleng nyang $1",
+       "edit": "Besut",
        "create": "Nggawé",
-       "create-local": "Tambah pawedharan lokal",
+       "create-local": "Tambah wedharan enggon-enggonan",
        "editthispage": "Sunting kaca iki",
        "create-this-page": "Nggawé kaca iki",
        "delete": "Busak",
        "unprotectthispage": "Owahi pangreksan kaca iki",
        "newpage": "Kaca anyar",
        "talkpage": "Dhiskusèkna kaca iki",
-       "talkpagelinktext": "Wicara",
+       "talkpagelinktext": "gunem",
        "specialpage": "Kaca astaméwa",
-       "personaltools": "Piranti pribadi",
+       "personaltools": "Piranti pribadhi",
        "articlepage": "nDeleng artikel",
-       "talk": "Dhiskusi",
+       "talk": "Rembug",
        "views": "Tampilan",
        "toolbox": "Piranti",
        "userpage": "Ndeleng kaca panganggo",
        "viewhelppage": "Ndeleng kaca pitulung",
        "categorypage": "Ndeleng kaca kategori",
        "viewtalkpage": "Ndeleng kaca dhiskusi",
-       "otherlanguages": "Basa liya",
+       "otherlanguages": "Jeroning basa liya",
        "redirectedfrom": "(Dialihkan dari $1)",
        "redirectpagesub": "Kaca pangalihan",
-       "lastmodifiedat": "Kaca iki diowahi pungkasané nalika $2, $1.",
+       "lastmodifiedat": "Kaca iki pungkasan diowah kala $1, tabuh $2.",
        "viewcount": "Kaca iki wis tau diaksès cacahé ping {{PLURAL:$1|siji|$1}}.",
        "protectedpage": "Kaca sing direksa",
-       "jumpto": "Langsung menyang:",
-       "jumptonavigation": "navigasi",
+       "jumpto": "Jujug:",
+       "jumptonavigation": "napigasi",
        "jumptosearch": "golèk",
        "view-pool-error": "Nyuwun ngapuro, peladèn lagi sibuk wektu iki.\nKakèhan panganggo sing nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
        "pool-timeout": "Kelangkung wekdal nengga kunci",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
-       "aboutsite": "Prakara {{SITENAME}}",
-       "aboutpage": "Project:Prakara",
+       "aboutsite": "Bab {{SITENAME}}",
+       "aboutpage": "Project:Bab",
        "copyright": "Kabèh isi kasedyakaké miturut $1.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
-       "currentevents": "Prastawa saiki",
-       "currentevents-url": "Project:Prastawa saiki",
-       "disclaimers": "Pamaidonan",
-       "disclaimerpage": "Project:Panyangkalan umum",
-       "edithelp": "Pitulung panyuntingan",
-       "mainpage": "Kaca Utama",
-       "mainpage-description": "Kaca Utama",
+       "currentevents": "Kadadéan saiki",
+       "currentevents-url": "Project:Kadadéan saiki",
+       "disclaimers": "Sélakan",
+       "disclaimerpage": "Project:Sélakan umum",
+       "edithelp": "Pitulung besut",
+       "mainpage": "Kaca Pokok",
+       "mainpage-description": "Kaca pokok",
        "policy-url": "Project:Kabijakan",
-       "portal": "Gapura komunitas",
-       "portal-url": "Project:Portal komunitas",
-       "privacy": "Kebijakan privasi",
-       "privacypage": "Project:Kabijakan privasi",
+       "portal": "Gapura paguyuban",
+       "portal-url": "Project:Garupa paguyuban",
+       "privacy": "Niti pripasi",
+       "privacypage": "Project:Niti pripasi",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
        "badaccess-groups": "Pratingkah panjenengan diwatesi tumrap panganggo ing {{PLURAL:$2|klompoké|klompoké}}: $1.",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "OK",
-       "retrievedfrom": "Sumber artikel iki saka kaca situs web: \"$1\"",
+       "retrievedfrom": "Dijupuk saka: \"$1\"",
        "youhavenewmessages": "Panjenengan kagungan $1 ($2).",
        "youhavenewmessagesfromusers": "Sampéyan nduwé $1 saka  {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "youhavenewmessagesmanyusers": "Sampéyang nduwé $1 saka akèh panganggo ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
        "youhavenewmessagesmulti": "Panjenengan olèh pesen-pesen anyar $1",
-       "editsection": "sunting",
-       "editold": "sunting",
+       "editsection": "besut",
+       "editold": "besut",
        "viewsourceold": "deleng sumber",
-       "editlink": "sunting",
+       "editlink": "besut",
        "viewsourcelink": "deleng sumber",
-       "editsectionhint": "Sunting bagian: $1",
-       "toc": "Bab lan paragraf",
+       "editsectionhint": "Besut pérangan: $1",
+       "toc": "Isi",
        "showtoc": "tuduhna",
        "hidetoc": "delikna",
        "collapsible-collapse": "Singidaken",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "site-rss-feed": "$1 ''RSS Feed''",
-       "site-atom-feed": "$1 ''Atom Feed''",
+       "site-atom-feed": "Umpan atom $1",
        "page-rss-feed": "\"$1\" ''RSS Feed''",
        "page-atom-feed": "\"$1\" ''Atom Feed''",
        "red-link-title": "$1 (kaca durung ana)",
        "sort-descending": "Urutaké medhun",
        "sort-ascending": "Urutaké munggah",
-       "nstab-main": "Artikel",
-       "nstab-user": "Panganggo",
+       "nstab-main": "Kaca",
+       "nstab-user": "Kaca panganggo",
        "nstab-media": "Media",
-       "nstab-special": "Astamiwa",
-       "nstab-project": "Proyek",
-       "nstab-image": "Gambar",
+       "nstab-special": "Kaca mirunggan",
+       "nstab-project": "Kaca proyèk",
+       "nstab-image": "Barkas",
        "nstab-mediawiki": "Pariwara",
-       "nstab-template": "Cithak",
+       "nstab-template": "Cithakan",
        "nstab-help": "Pitulung",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Kaca pokok",
        "nosuchaction": "Ora ana pratingkah kaya ngono",
        "nosuchactiontext": "Pratingkah sing dirinci déning URL ora sah.\nPanjenengan manawa salah ketik nalika ngisi URL, utawa salah ngisi pranala.\nIki manawa uga nuduhaké anané kesalahan ing piranti alus sing dipigunakaké déning {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca astaméwa kaya ngono",
        "cannotdelete-title": "Ora bisa mbusak kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
-       "badtitle": "Judhulé ora sah",
+       "badtitle": "Sésirah ala",
        "badtitletext": "Judhul kaca sing panjenengan ora bisa dituduhaké, kosong, utawa dadi judhul antar-basa utawa judhul antar-wiki. Iku bisa uga ana  sawijining utawa luwih aksara sing ora bisa didadèkaké judhul.",
        "perfcached": "Data iki mung dijupuk saka papan singgahan lan mungkin ora kaanyaran. Maksimum {{PLURAL:$1|sak asil|$1 asil}} sumadhiya nèng papan singgahan.",
        "perfcachedts": "Data iki mung dijupuk saka papan singgahan lan mungkin dianyari pungkasan $1. Maksimum {{PLURAL:$4|sak asil|$4 asil}} sumadhiya nèng papan singgahan.",
        "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
-       "viewsource": "Tuduhna sumber",
+       "viewsource": "Deleng sumber",
        "viewsource-title": "Delok sumberé $1",
        "actionthrottled": "Tindakan diwatesi",
        "actionthrottledtext": "Minangka sawijining pepesthèn anti-spam, panjenengan diwatesi nglakoni tindhakan iki sing cacahé kakèhan ing wektu cendhak.\nMangga dicoba manèh ing sawetara menit.",
        "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
        "yourname": "Asma pangangeman",
        "userlogin-yourname": "Jeneng panganggo",
-       "userlogin-yourname-ph": "Lebokaké jenengné panganggo",
+       "userlogin-yourname-ph": "Isi jeneng panganggo Sampéyan",
        "createacct-another-username-ph": "Lebokna jeneng panganggo:",
        "yourpassword": "Tembung sandhi:",
-       "userlogin-yourpassword": "Tembung sandhi",
+       "userlogin-yourpassword": "Tembung wadi",
        "userlogin-yourpassword-ph": "Lebokna tembung sandhi",
        "createacct-yourpassword-ph": "Lebokna tembung sandhi",
        "yourpasswordagain": "Balènana tembung sandhi",
        "createacct-yourpasswordagain": "Konfirmasi tembung sandhi",
        "createacct-yourpasswordagain-ph": "Lebokna tembung sandhi maneh",
        "remembermypassword": "Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})",
-       "userlogin-remembermypassword": "Gawe supaya aku tetep mlebet log terus",
+       "userlogin-remembermypassword": "Panggah mlebu",
        "userlogin-signwithsecure": "Nganggo koneksi aman",
        "yourdomainname": "Dhomain panjenengan",
        "password-change-forbidden": "Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.",
        "externaldberror": "Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.",
-       "login": "Mlebu log",
+       "login": "Mlebu",
        "nav-login-createaccount": "Log mlebu / nggawé rékening (akun)",
        "userlogin": "Mlebu log / gawé rékening (akun)",
        "userloginnocreate": "Mlebu log",
        "logout": "Oncat",
        "userlogout": "Metu log",
        "notloggedin": "Durung mlebu log",
-       "userlogin-noaccount": "Durung kagungan akun?",
-       "userlogin-joinproject": "Gabung {{SITENAME}}",
+       "userlogin-noaccount": "Durung duwé akun?",
+       "userlogin-joinproject": "Mèlua {{SITENAME}}",
        "nologin": "Durung kagungan asma panganggo? '''$1'''.",
        "nologinlink": "Ndaftaraké akun anyar",
-       "createaccount": "Nggawé akun anyar",
+       "createaccount": "Gawé akun",
        "gotaccount": "Wis kagungan akun? '''$1'''.",
        "gotaccountlink": "Mlebu",
        "userlogin-resetlink": "Lali rincian mlebu log Sampéyan?",
-       "userlogin-resetpassword-link": "Sampéyan kélangan tembung sandhi?",
+       "userlogin-resetpassword-link": "Lali tembung wadiné Sampéyan?",
        "userlogin-loggedin": "Sampeyan sampun mlebet log dadi {{GENDER:$1|$1}}.\nGunakna formulir ing ngisor iki kanggo mlebet log dadi panganggo liyane.",
        "userlogin-createanother": "Gawé akun anyar",
        "createacct-emailrequired": "Alamat layang èlèktronik",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
-       "pt-login": "Mlebet log",
-       "pt-createaccount": "Damel akun enggal",
+       "pt-login": "Mlebu",
+       "pt-createaccount": "Gawé akun",
        "php-mail-error-unknown": "Kasalahan ora dingertèni nèng piguna mail() PHP.",
        "user-mail-no-addy": "Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.",
        "user-mail-no-body": "Nyoba ngirim layang e-mail, tapi isine kosong.",
        "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing daptar pangawasan sampeyan]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token sing dipilih",
-       "bold_sample": "Tèks iki bakal dicithak kandel",
-       "bold_tip": "Cithak kandel",
-       "italic_sample": "Tèks iki bakal dicithak miring",
+       "bold_sample": "Tulisan kandel",
+       "bold_tip": "Tulisann kandel",
+       "italic_sample": "Tulisan miring",
        "italic_tip": "Cithak miring",
-       "link_sample": "Judhul pranala",
+       "link_sample": "Sesirah pranala",
        "link_tip": "Pranala njero",
-       "extlink_sample": "http://www.example.com judhul pranala",
-       "extlink_tip": "Pranala njaba (aja lali wiwitan http:// )",
+       "extlink_sample": "http://www.example.com sesirahing pranala",
+       "extlink_tip": "Pranala jaba (élinga ater-ater http://)",
        "headline_sample": "Tèks judhul",
        "headline_tip": "Subbagian tingkat 1",
        "nowiki_sample": "Tèks iki ora bakal diformat",
        "image_sample": "Conto.jpg",
        "image_tip": "Mènèhi gambar/berkas",
        "media_sample": "Conto.ogg",
-       "media_tip": "Pranala berkas media",
+       "media_tip": "Pranala barkas",
        "sig_tip": "Tapak asta panjenengan mawa tandha wektu",
        "hr_tip": "Garis horisontal",
-       "summary": "Ringkesan:",
+       "summary": "Tingkesan:",
        "subject": "Subyek/judhul:",
-       "minoredit": "Iki suntingan cilik.",
+       "minoredit": "Iki besutan cilik",
        "watchthis": "Awasana kaca iki",
        "savearticle": "Simpen kaca",
        "preview": "Pratayang",
        "showpreview": "Mirsani pratayang",
-       "showdiff": "Tuduhna pangowahan",
+       "showdiff": "Tuduhaké owahan",
        "anoneditwarning": "<strong>Penget:</strong> Panjenengan boten mlebet log. Alamat IP Panjenengan badhe katingal dening publik manawi Panjenengan ngayahi ewah-ewahan. Manawi Panjenengan  <strong>[$1 mlebet log]</strong> utawai <strong>[$2 damel akun]</strong>, suntingan Panjenengan badhe kaatribusekaken dhumateng  nama pangangge Panjenengan, lan rupi-rupi  kauntungan sanesipun.",
        "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
        "missingsummary": "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
        "nosuchsectiontitle": "Bagéan ora ditemokaké",
        "nosuchsectiontext": "Panjenengan nyoba nyunting sawijining bagéan sing ora ana.\nBagéan iki manawa wis dipindhah utawa dibusak nalika panjenengan buka.",
        "loginreqtitle": "Mangga mlebu log",
-       "loginreqlink": "mlebu log",
+       "loginreqlink": "mlebu",
        "loginreqpagetext": "Panjenengan kudu $1 kanggo bisa mirsani kaca liyané.",
        "accmailtitle": "Tembung sandhi wis dikirim.",
        "accmailtext": "Sawijining tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi kanggo panganggo anyar iki isa diganti ing kaca ''[[Special:ChangePassword|ganti tembung sandi]]'' sawisé mlebu log.",
        "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
        "token_suffix_mismatch": "'''Suntingan panjenengan ditulak amerga aplikasi klièn panjenengan ngowahi karakter tandha wewacan ing suntingan. Suntingan iku ditulak kanggo untuk menggak kaluputan ing tèks artikel. Prekara iki kadhangkala dumadi yèn panjenengan ngangem dines layanan proxy anonim adhedhasar situs wèb sing duwé masalah.'''",
        "edit_form_incomplete": "'''Sebagéyan pormulir suntingan ora tekan nèng sasana; cèk pindho yèn suntingan Sampéyan isih wutuh lan jajal manèh.'''",
-       "editing": "Nyunting $1",
+       "editing": "Mbesut $1",
        "creating": "Nggawé $1",
        "editingsection": "Nyunting $1 (bagian)",
        "editingcomment": "Nyunting $1 (bagéyan anyar)",
        "templatesused": "{{PLURAL:$1|Cithakan|Cithakan}} sing dienggo ing kaca iki:",
        "templatesusedpreview": "{{PLURAL:$1|Cithakan|Cithakan-cithakan}} sing dienggo ing pratilik iki:",
        "templatesusedsection": "{{PLURAL:$1|Cithakan}} sing dienggo ding bagian iki:",
-       "template-protected": "(direksa)",
-       "template-semiprotected": "(semi-pangreksan)",
+       "template-protected": "(kareksa)",
+       "template-semiprotected": "(semu kareksa)",
        "hiddencategories": "Kaca iki sawijining anggota saka {{PLURAL:$1|1 kategori ndelik|$1 kategori-kategori ndelik}}:",
        "edittools": "<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->",
        "nocreatetext": "Situs iki ngwatesi kemampuan kanggo nggawé kaca anyar. Panjenengan bisa bali lan nyunting kaca sing wis ana, utawa mangga [[Special:UserLogin|mlebua log utawa ndaftar]]",
        "currentrevisionlink": "Revisi saiki",
        "cur": "saiki",
        "next": "sabanjuré",
-       "last": "akir",
+       "last": "sadurung",
        "page_first": "kapisan",
        "page_last": "pungkasan",
        "histlegend": "Pilihen rong tombol radhio banjur pencèten tombol ''bandhingna'' kanggo mbandhingaké versi. Klik sawijining tanggal kanggo ndeleng versi kaca ing tanggal iku.<br />(skr) = prabédan karo vèrsi saiki, (akir) = prabédan karo vèrsi sadurungé, '''s''' = suntingan sithik, '''b''' = suntingan bot, → = suntingan bagian, ← = ringkesan otomatis",
        "difference-title": "$1: Bèntenipun revisi",
        "difference-title-multipage": "Prabédhan antara kaca \"$1\" lan \"$2\"",
        "difference-multipage": "(Prabédhan antar kaca)",
-       "lineno": "Larikan $1:",
+       "lineno": "Larik $1:",
        "compareselectedversions": "Bandhingna vèrsi kapilih",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
-       "editundo": "batalna",
+       "editundo": "wurungaké",
        "diff-empty": "(Ora ana bedane)",
        "diff-multi-manyusers": "({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)",
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
-       "searchresults": "Kasil panggolèkan",
-       "searchresults-title": "Kasil panggolèkan saka \"$1\"",
+       "searchresults": "Kasiling golèk",
+       "searchresults-title": "Kasiling golèk \"$1\"",
        "titlematches": "Irah-irahan artikel sing cocog",
        "textmatches": "Tèks artikel sing cocog",
        "notextmatches": "Ora ana tèks kaca sing cocog",
        "searchmenu-new": "'''Damel kaca \"[[:$1]]\" ing wiki punika!'''",
        "searchprofile-articles": "Kaca isi",
        "searchprofile-images": "Multimedia",
-       "searchprofile-everything": "Kabèh",
+       "searchprofile-everything": "Samubarang",
        "searchprofile-advanced": "Tataran luwih dhuwur/maju",
-       "searchprofile-articles-tooltip": "Panggolèkan ing $1",
-       "searchprofile-images-tooltip": "Panggolèkan berkas",
+       "searchprofile-articles-tooltip": "Golèkan ing $1",
+       "searchprofile-images-tooltip": "Golèk barkas",
        "searchprofile-everything-tooltip": "Panggolèkan kabèh isi (klebu kaca-kaca wicara)",
        "searchprofile-advanced-tooltip": "Panggolèkan ing bilik jeneng biasa (''custom'')",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(pangalihan $1)",
-       "search-section": "(sèksi $1)",
+       "search-section": "(pérangan $1)",
        "search-suggest": "Apa panjenengan kersané: $1",
        "search-interwiki-caption": "Proyèk-proyèk kagandhèng",
        "search-interwiki-default": "Pituwas $1:",
        "nchanges": "$1 {{PLURAL:$1|pangowahan|owah-owahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|saka keri dhewe mrene}}",
        "enhancedrc-history": "sajarah",
-       "recentchanges": "Owah-owahan",
+       "recentchanges": "Owahan pungkasan",
        "recentchanges-legend": "Pilihan owah-owahan pungkasan",
        "recentchanges-summary": "Runutna owah-owahan pungkasan ing wiki iki ing kaca iki.",
        "recentchanges-noresult": "Ora ana pangowahan ing periode sing diwiwiti kriteria iki.",
        "recentchanges-feed-description": "Urutna owah-owahan anyar ing wiki ing ''feed'' iki.",
-       "recentchanges-label-newpage": "Suntingan iki gawé kaca anyar",
-       "recentchanges-label-minor": "Iki suntingan sithik",
-       "recentchanges-label-bot": "Suntingan iki diayahi déning bot",
+       "recentchanges-label-newpage": "Besutan iki nggawé kaca anyar",
+       "recentchanges-label-minor": "Iki besutan cilik",
+       "recentchanges-label-bot": "Besutan iki diayahi bot",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
        "recentchanges-label-plusminus": "Agengipun kaca sampun dipunowahi samekaten.",
        "recentchanges-legend-heading": "<strong>Katrangan:</strong>",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Saiki nuduhaké owah-owahan wiwit tanggal $3 $2",
-       "rcshowhideminor": "$1 suntingan sithik",
+       "rcshowhideminor": "$1 besutan cilik",
        "rcshowhideminor-hide": "Singidaken",
        "rcshowhidebots": "$1 bot",
-       "rcshowhidebots-show": "Tedahaken",
-       "rcshowhideliu": "$1 panganggo sing wis ndaptar",
+       "rcshowhidebots-show": "Tuduhaké",
+       "rcshowhideliu": "$1 panganggo karégister",
        "rcshowhideliu-hide": "Singidaken",
        "rcshowhideanons": "$1 panganggo anonim",
        "rcshowhideanons-hide": "Singidaken",
        "rcshowhidepatr": "$1 suntingan sing dipatroli",
-       "rcshowhidemine": "$1 suntinganku",
+       "rcshowhidemine": "$1 besutanku",
        "rcshowhidemine-hide": "Singidaken",
        "rclinks": "Tuduhna owah-owahan pungkasan $1 ing $2 dina pungkasan iki.<br />$3",
-       "diff": "béda",
-       "hist": "sajarah",
+       "diff": "béd",
+       "hist": "saj",
        "hide": "Delikna",
-       "show": "Tuduhna",
-       "minoreditletter": "s",
+       "show": "Tuduhaké",
+       "minoreditletter": "c",
        "newpageletter": "A",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
        "rc_categories": "Watesana nganti kategori (dipisah karo \"|\")",
        "rc_categories_any": "Apa waé",
-       "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} sakwisé diowah",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sabubaré diowah",
        "newsectionsummary": "/* $1 */ bagéyan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "rc-enhanced-hide": "Dhelikaké princèn",
        "rc-old-title": "wigatiné digawé minangka \"$1\"",
-       "recentchangeslinked": "Pangowahan sing terkait",
+       "recentchangeslinked": "Owahan magepokan",
        "recentchangeslinked-feed": "Pangowahan sing terkait",
-       "recentchangeslinked-toolbox": "Pangowahan sing terkait",
+       "recentchangeslinked-toolbox": "Owahan magepokan",
        "recentchangeslinked-title": "Owah-owahan sing ana gandhèngané karo \"$1\"",
        "recentchangeslinked-summary": "Kaca astaméwa (kaca kusus) iki mènèhi daftar owah-owahan pungkasan ing kaca-kaca sing kagandhèng (utawa anggota sawijining kateogri). Kaca sing [[Special:Watchlist|panjenengan awasi]] ditandhani '''kandel'''.",
        "recentchangeslinked-page": "Jeneng kaca:",
        "recentchangeslinked-to": "Nuduhaké owah-owahan menyang kaca sing disambung menyang kaca-kaca iki",
-       "upload": "Unggah",
+       "upload": "Unggah barkas",
        "uploadbtn": "Unggahna berkas",
        "reuploaddesc": "Bali ing formulir pamotan",
        "upload-tryagain": "Kirim déskripsi berkas sing wis diowah",
        "uploadlogpage": "Log pangunggahan",
        "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas sing anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
        "filename": "Jeneng berkas",
-       "filedesc": "Ringkesan",
+       "filedesc": "Tingkesan",
        "fileuploadsummary": "Ringkesan:",
        "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "upload-curl-error28": "Pangunggahan ngliwati wektu",
        "upload-curl-error28-text": "Situsé kesuwèn sadurungé réaksi.\nMangga dipriksa menawa situsé aktif, nunggu sedélok lan coba manèh.\nMbok-menawa panjenengan bisa nyoba manèh ing wektu sing luwih longgar.",
        "license": "Jenis lisènsi:",
-       "license-header": "Jinis lisènsi",
+       "license-header": "Pamalilah",
        "nolicense": "Durung ana sing dipilih",
        "license-nopreview": "(Pratayang ora sumedya)",
        "upload_source_url": " (sawijining URL absah sing bisa diaksès publik)",
        "upload_source_file": " (sawijining berkas ing komputeré panjenengan)",
        "listfiles-summary": "Kaca astamiwa nudhuhaké kabèh berkas kaunggah.\nYèn disaring déning panganggo, namung berkas mawa vèrsi paling anyar waé sing bakal katon.",
        "listfiles_search_for": "Golèk jeneng gambar:",
-       "imgfile": "gambar",
+       "imgfile": "barkas",
        "listfiles": "Daftar gambar",
        "listfiles_thumb": "Gambar mini",
        "listfiles_date": "Tanggal",
        "listfiles-latestversion": "Versi saiki",
        "listfiles-latestversion-yes": "Iya",
        "listfiles-latestversion-no": "Ora",
-       "file-anchor-link": "Gambar",
+       "file-anchor-link": "Barkas",
        "filehist": "Sajarah berkas",
        "filehist-help": "Klik ing tanggal/wektu kanggo deleng berkas iki ing wektu iku.",
        "filehist-deleteall": "busaken kabèh",
        "filehist-deleteone": "busaken iki",
        "filehist-revert": "balèkna",
-       "filehist-current": "saiki iki",
-       "filehist-datetime": "Tanggal/Wektu",
+       "filehist-current": "saiki",
+       "filehist-datetime": "Surya/Tabuh",
        "filehist-thumb": "Miniatur (''thumbnail'')",
        "filehist-thumbtext": "Miniatur kanggo versi ing $1",
        "filehist-nothumb": "Ora ana miniatur",
        "filehist-user": "Panganggo",
        "filehist-dimensions": "Ukuran",
        "filehist-filesize": "Gedhené berkas",
-       "filehist-comment": "Komentar",
+       "filehist-comment": "Tanggapan",
        "imagelinks": "Panganggoan berkas",
        "linkstoimage": "Kaca-kaca sing kapacak iki duwé {{PLURAL:$1|pranala|$1 pranala}} menyang berkas iki:",
        "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
        "unusedtemplates": "Cithakan sing ora dienggo",
        "unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} sing ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
        "unusedtemplateswlh": "pranala liya-liyané",
-       "randompage": "Sembarang kaca",
+       "randompage": "Waton kaca",
        "randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "prevpage": "Kaca sadurungé ($1)",
        "allpagesfrom": "Kaca-kaca kawiwitan kanthi:",
        "allpagesto": "Tampilaké kaca dipungkasi ing:",
-       "allarticles": "Kabèh artikel",
+       "allarticles": "Kabèh kaca",
        "allinnamespace": "Kabeh kaca ($1 namespace)",
-       "allpagessubmit": "Madosi",
+       "allpagessubmit": "Menyang",
        "allpagesprefix": "Kapacak kaca-kaca ingkang mawi ater-ater:",
        "allpagesbadtitle": "Irah-irahan (judhul) ingkang dipun-gunaaken boten sah utawi nganggé ater-ater (awalan) antar-basa utawi antar-wiki. Irah-irahan punika saged ugi nganggé setunggal aksara utawi luwih ingkang boten saged kagunaaken dados irah-irahan.",
        "allpages-bad-ns": "{{SITENAME}} ora duwé bilik nama \"$1\".",
        "cachedspecial-viewing-cached-ttl": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi lawasé wis $1.",
        "cachedspecial-viewing-cached-ts": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi ora padha karo kasunyatan.",
        "cachedspecial-refresh-now": "Delok sing paling anyar.",
-       "categories": "Daftar kategori",
+       "categories": "Kategori",
        "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori sing ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori sing diperlokaké]].",
        "categoriesfrom": "Tampilaké kategori-kategori diwiwiti saka:",
        "special-categories-sort-count": "urutna miturut angka",
        "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].\nOwah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné.",
        "removewatch": "Singkiraké saka daptar pangawasan",
        "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|daftar pangawasan]].",
-       "watch": "tutana",
+       "watch": "Awati",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Ora usah ngawasaké manèh",
        "unwatchthispage": "Batalna olèhé ngawasi kaca iki",
        "undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
        "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
-       "namespace": "Bilik nama (bilik jeneng):",
+       "namespace": "Lowah aran:",
        "invert": "Balèkna pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
        "namespace_association": "Bilik jeneng kakait",
        "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
-       "blanknamespace": "(Utama)",
+       "blanknamespace": "(Pokok)",
        "contributions": "Sumbangan {{GENDER:$1|panganggo}}",
        "contributions-title": "Kontribusi panganggo kanggo $1",
        "mycontris": "Kontribusi",
        "sp-contributions-username": "Alamat IP utawa jeneng panganggo:",
        "sp-contributions-toponly": "Tuduhaké was suntingan saka benahan pungkasan",
        "sp-contributions-submit": "Golèk",
-       "whatlinkshere": "Pranala balik",
-       "whatlinkshere-title": "Kaca-kaca sing duwé pranala menyang \"$1\"",
+       "whatlinkshere": "Sing nggayut mréné",
+       "whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere": "Kaca-kaca iki nduwé pranala menyang '''[[:$1]]''':",
        "nolinkshere": "Ora ana kaca sing nduwé pranala menyang '''[[:$1]]'''.",
        "nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''[[:$1]]''' ing bilik jeneng sing kapilih.",
-       "isredirect": "kaca pangalihan",
+       "isredirect": "kaca lihlihan",
        "istemplate": "karo cithakan",
        "isimage": "pranala berkas",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "pranala-pranala $1",
        "whatlinkshere-hideimages": "$1 pranala berkas",
-       "whatlinkshere-filters": "Filter-filter",
+       "whatlinkshere-filters": "Panyaringan",
        "autoblockid": "Blokir otomatis #$1",
        "block": "Blokir panganggo",
        "unblock": "Uculaké blokirané panganggo",
        "blocklist-nousertalk": "ora éntuk nyunting kaca gunemané dhéwé",
        "ipblocklist-empty": "Daftar pamblokiran kosong.",
        "ipblocklist-no-results": "alamat IP utawa panganggo sing disuwun ora diblokir.",
-       "blocklink": "blokir",
+       "blocklink": "palang",
        "unblocklink": "jabel blokir",
        "change-blocklink": "owahi blokir",
        "contribslink": "sumbangan",
        "allmessages-prefix": "Saring nganggo ater-ater:",
        "allmessages-language": "Basa:",
        "allmessages-filter-submit": "Tumuju menyang",
-       "thumbnail-more": "Gedhèkna",
+       "thumbnail-more": "Gedhèkaké",
        "filemissing": "Berkas ora ditemokaké",
        "thumbnail_error": "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
        "thumbnail_error_remote": "Peringatan kasalahan saka $1:\n$2",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révisi|révisi}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} saka $2",
        "javascripttest": "Panjajalan JavaScript",
-       "javascripttest-pagetext-noframework": "Kaca iki disadhiyakaké kanggo nglakokaké panjajalan JavaScript.",
-       "javascripttest-pagetext-unknownframework": "Rangka kerja panjajalan ora dingertèni \"$1\".",
-       "javascripttest-pagetext-frameworks": "Mangga pilih sawiji saka rangka kerja panjajalan iki: $1",
-       "javascripttest-pagetext-skins": "Pilih kulit kanggo nglakokaké panjajalan mawa:",
        "javascripttest-qunit-intro": "Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.",
        "tooltip-pt-userpage": "Kaca panganggo panjenengan",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-preferences": "Préferènsiku",
        "tooltip-pt-watchlist": "Daftar kaca sing tak-awasi.",
        "tooltip-pt-mycontris": "Daftar kontribusi panjenengan",
-       "tooltip-pt-login": "Panjenengan diaturi mlebu log, nanging ora dikudokaké.",
-       "tooltip-pt-logout": "Log metu (oncat)",
-       "tooltip-pt-createaccount": "Panjenengan kasuwun damel akun lan mlebet log; ananging bab punika boten wajib",
-       "tooltip-ca-talk": "Dhiskusi perkara isi",
-       "tooltip-ca-edit": "Sunting kaca iki. Nganggoa tombol pratayang sadurungé nyimpen.",
-       "tooltip-ca-addsection": "Miwiti bagèyan anyar",
+       "tooltip-pt-login": "Sampéyan prayogané mlebu masiya ora kudu",
+       "tooltip-pt-logout": "Metu",
+       "tooltip-pt-createaccount": "Sampéyan prayogané gawé akun lan mlebu masiya ora kudu",
+       "tooltip-ca-talk": "Parembuganing kaca isi",
+       "tooltip-ca-edit": "Besut kaca iki",
+       "tooltip-ca-addsection": "Wiwiti pérangan anyar",
        "tooltip-ca-viewsource": "Kaca iki direksa. Panjenengan namung bisa mirsani sumberé.",
        "tooltip-ca-history": "Vèrsi-vèrsi sadurungé saka kaca iki.",
        "tooltip-ca-protect": "Reksa kaca iki",
        "tooltip-ca-move": "Pindhahen kaca iki",
        "tooltip-ca-watch": "Tambahna kaca iki ing daftar pangawasan panjenengan",
        "tooltip-ca-unwatch": "Busak kaca iki saka daftar pangawasan panjenengan",
-       "tooltip-search": "Golek ing situs {{SITENAME}} iki",
-       "tooltip-search-go": "Lungaa ing kaca mawa jeneng persis iki, yèn anaa",
-       "tooltip-search-fulltext": "Golèk kaca sing duwé tèks kaya mangkéné",
-       "tooltip-p-logo": "Kaca Utama",
-       "tooltip-n-mainpage": "Nuwèni Kaca Utama",
-       "tooltip-n-mainpage-description": "Pirsani Kaca Utama",
-       "tooltip-n-portal": "Perkara proyèk, apa sing bisa panjenengan gayuh, lan ing ngendi golèk apa-apa",
+       "tooltip-search": "Golèk nyang {{SITENAME}}",
+       "tooltip-search-go": "Jujug kaca asesirah persis mangkéné yèn ana",
+       "tooltip-search-fulltext": "Golèk kaca isi tulisan kaya mangkéné",
+       "tooltip-p-logo": "Menyang kaca pokok",
+       "tooltip-n-mainpage": "Menyang kaca pokok",
+       "tooltip-n-mainpage-description": "Menyang kaca pokok",
+       "tooltip-n-portal": "Bab proyèk, apa sing bisa Sampéyan garap, ana ing endi saprelu golèk apa-apa",
        "tooltip-n-currentevents": "Temokna informasi perkara prastawa anyar",
-       "tooltip-n-recentchanges": "Daftar owah-owahan anyar ing wiki.",
-       "tooltip-n-randompage": "Tuduhna sembarang kaca",
-       "tooltip-n-help": "Papan kanggo golèk pitulung.",
-       "tooltip-t-whatlinkshere": "Daftar kabèh kaca wiki sing nyambung menyang kaca iki",
+       "tooltip-n-recentchanges": "Pratélaning owah-owahan pungkasan sajeroning wiki.",
+       "tooltip-n-randompage": "Mot waton kaca",
+       "tooltip-n-help": "Papan kanggo golèk weruh",
+       "tooltip-t-whatlinkshere": "Pratélaning kabèh kaca wiki sing nggayut mréné",
        "tooltip-t-recentchangeslinked": "Owah-owahan pungkasan kaca-kaca sing duwé pranala menyang kaca iki",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "''Atom feed'' kanggo kaca iki",
        "tooltip-t-contributions": "Deleng daftar kontribusi panganggo iki",
        "tooltip-t-emailuser": "Kirimna e-mail menyang panganggo iki",
-       "tooltip-t-upload": "Ngunggah gambar utawa berkas média",
-       "tooltip-t-specialpages": "Daftar kabèh kaca astaméwa (kaca kusus)",
-       "tooltip-t-print": "Vèrsi cithak kaca iki",
+       "tooltip-t-upload": "Unggah barkas",
+       "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
+       "tooltip-t-print": "Cara cithakan kaca iki",
        "tooltip-t-permalink": "Pranala permanèn kanggo révisi kaca iki",
-       "tooltip-ca-nstab-main": "Ndeleng kaca artikel",
+       "tooltip-ca-nstab-main": "Deleng kaca isi",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "tooltip-ca-nstab-media": "Ndeleng kaca média",
        "tooltip-ca-nstab-special": "Iki kaca astaméwa utawa kaca kusus sing ora bisa disunting",
        "tooltip-ca-nstab-project": "Deleng kaca proyèk",
-       "tooltip-ca-nstab-image": "Deleng kaca berkas",
+       "tooltip-ca-nstab-image": "Deleng kaca barkas",
        "tooltip-ca-nstab-mediawiki": "Ndeleng pesenan sistém",
        "tooltip-ca-nstab-template": "Deleng cithakan",
        "tooltip-ca-nstab-help": "Mirsani kaca pitulung",
        "tooltip-rollback": "Mbalèkaké suntingan-suntingan ing kaca iki menyang kontributor pungkasan nganggo sak klik.",
        "tooltip-undo": "Mbalèkaké révisi iki lan mbukak kothak panyuntingan jroning mode pratayang. Wènèhi kasempatan kanggo ngisi alesan ing kothak ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
-       "tooltip-summary": "Lebokna ringkesan cendhèk",
+       "tooltip-summary": "Isi tingkesan cendhak",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Katégori|Katégori}} kadhelikaké ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Kaca|Kaca}} sing ditransklusi ing ($1)",
-       "pageinfo-toolboxlink": "Informasi kaca",
+       "pageinfo-toolboxlink": "Katerangan kaca",
        "pageinfo-redirectsto": "Dialihaké dhateng",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Diétung minangka satunggaling kaca isi",
        "svg-long-desc": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
        "svg-long-desc-animated": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
        "svg-long-error": "Berkas SVG ora sah: $1",
-       "show-big-image": "Berkas asli",
+       "show-big-image": "Barkas asli",
        "show-big-image-preview": "Gedhéné pratayang iki: $1",
        "show-big-image-other": "{{PLURAL:$2|Résolusi|Résolusi}} liya: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "exif-datetime": "Tanggal lan wektu pangowahan berkas",
        "exif-imagedescription": "Judhul gambar",
        "exif-make": "Produsèn kamera",
-       "exif-model": "Modhèl kamera",
-       "exif-software": "Perangkat lunak",
+       "exif-model": "Modhèl kaméra",
+       "exif-software": "Piranti alus sing dianggo",
        "exif-artist": "Prodhusèn",
        "exif-copyright": "Sing ndarbèni hak cipta",
        "exif-exifversion": "Vèrsi Exif",
        "exif-flashpixversion": "Dukungan versi Flashpix",
-       "exif-colorspace": "Papan werna",
+       "exif-colorspace": "Lowah warna",
        "exif-componentsconfiguration": "Teges saben komponèn",
        "exif-compressedbitsperpixel": "Modhe komprèsi gambar",
-       "exif-pixelydimension": "Jembaré gambar",
-       "exif-pixelxdimension": "Dhuwuré gambar",
+       "exif-pixelxdimension": "Jembaré gambar",
+       "exif-pixelydimension": "Dhuwuré gambar",
        "exif-usercomment": "Komentar panganggo",
        "exif-relatedsoundfile": "Berkas audio sing kagandhèng",
-       "exif-datetimeoriginal": "Tanggal lan wektu nggawé data",
-       "exif-datetimedigitized": "Tanggal lan wektu dhigitalisasi",
+       "exif-datetimeoriginal": "Surya lan tabuh panggawéning data",
+       "exif-datetimedigitized": "Surya lan tabuh dhigitalisasi",
        "exif-subsectime": "Subdetik DateTime",
        "exif-subsectimeoriginal": "Subdetik DateTimeOriginal",
        "exif-subsectimedigitized": "Subdetik DateTimeDigitized",
        "version-entrypoints-header-entrypoint": "Tithik lebon",
        "version-entrypoints-header-url": "URL",
        "redirect": "Dialihake dening gambar, panganggo, kaca, utawa ID revisi",
-       "redirect-legend": "Dialihake menyang gambar utawa kaca",
        "redirect-summary": "Kaca astamiwa iki dialihake menyang gambar (jeneng gambar diwenehi), kaca (ID revisi utama ID kaca diwenehi), utawa kaca panganggo (ID panganggo diwenehi). Cara nganggo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Nuju",
        "redirect-lookup": "Golek:",
        "redirect-not-exists": "Nilai ora ditemokaké",
        "fileduplicatesearch": "Golèk berkas duplikat",
        "fileduplicatesearch-summary": "Golèk duplikat berkas adhedhasar biji hash-é.",
-       "fileduplicatesearch-legend": "Golèk duplikat",
        "fileduplicatesearch-filename": "Jeneng berkas:",
        "fileduplicatesearch-submit": "Golèk",
        "fileduplicatesearch-info": "$1 × $2 piksel<br />Ukuran berkas: $3<br />Tipe MIME: $4",
        "fileduplicatesearch-result-1": "Berkas \"$1\" ora duwé duplikat idèntik.",
        "fileduplicatesearch-result-n": "Berkas \"$1\" ora ndarbèni {{PLURAL:$2|1 duplikat idèntik|$2 duplikat idèntik}}.",
        "fileduplicatesearch-noresults": "Ora ana berkas mawa jeneng \"$1\" ditemokaké.",
-       "specialpages": "Kaca astamiwa",
+       "specialpages": "Kaca mirunggan",
        "specialpages-note-top": "Katrangan",
        "specialpages-note": "* Kaca astamiwa biasa.\n* <span class=\"mw-specialpagerestricted\">Kaca astamiwa kawatesan.</span>",
        "specialpages-group-maintenance": "Lapuran pangopènan",
index b76c486..f1ba4b2 100644 (file)
        "exif-colorspace": "ფერთა სივრცე",
        "exif-componentsconfiguration": "ცალკეულ კომპონენტთა კონფიგურაცია",
        "exif-compressedbitsperpixel": "სურათის შეკუმშვის რეჟიმი",
-       "exif-pixelydimension": "სურათის სიგანე",
-       "exif-pixelxdimension": "სურათის სიმაღლე",
+       "exif-pixelxdimension": "სურათის სიგანე",
+       "exif-pixelydimension": "სურათის სიმაღლე",
        "exif-usercomment": "მომხმარებლის კომენტარი",
        "exif-relatedsoundfile": "შესაბამისი აუდიო ფაილი",
        "exif-datetimeoriginal": "გენერირების თარიღი და დრო",
        "redirect-not-exists": "მნიშვნელობა ვერ მოიძებნა",
        "fileduplicatesearch": "ერთნაირი ფაილების ძიება",
        "fileduplicatesearch-summary": "ერთნაირი ფაილების ძიება ჰეშ-კოდის მიხედვით.",
-       "fileduplicatesearch-legend": "დუბლიკატების ძიება",
        "fileduplicatesearch-filename": "ფაილის სახელი:",
        "fileduplicatesearch-submit": "ძიება",
        "fileduplicatesearch-info": "$1 × $2 პიქსელზე<br />ფაილის ზომაა: $3<br />MIME-ტიპი: $4",
index c9039a1..305513c 100644 (file)
        "exif-colorspace": "Tallunt n tiniskit",
        "exif-componentsconfiguration": "Anamek n yal isger",
        "exif-compressedbitsperpixel": "Askar n usekkusem n tugna",
-       "exif-pixelydimension": "Tehri n tugna",
-       "exif-pixelxdimension": "Taɣwzi n tugna",
+       "exif-pixelxdimension": "Tehri n tugna",
+       "exif-pixelydimension": "Taɣwzi n tugna",
        "exif-usercomment": "Iwenniten n useqdac",
        "exif-relatedsoundfile": "Afaylu n eslu yeqqnen",
        "exif-datetimeoriginal": "Azmez n tuddma tamezwarut",
index 65c014c..e69db51 100644 (file)
        "exif-colorspace": "ٴتۇس اياسى",
        "exif-componentsconfiguration": "ارقايسى قۇراش ٴمانى",
        "exif-compressedbitsperpixel": "سۋرەت قىسىمداۋ ٴتارتىبى",
-       "exif-pixelydimension": "سۋرەتتىڭ جارامدى ەنى",
-       "exif-pixelxdimension": "سۋرەتتىڭ جارامدى بىيىكتىگى",
+       "exif-pixelxdimension": "سۋرەتتىڭ جارامدى ەنى",
+       "exif-pixelydimension": "سۋرەتتىڭ جارامدى بىيىكتىگى",
        "exif-usercomment": "قاتىسۋشىنىڭ ماندەمەلەرى",
        "exif-relatedsoundfile": "قاتىستى دىبىس فايلى",
        "exif-datetimeoriginal": "جاسالعان كەزى",
index 0835680..2d9d258 100644 (file)
        "exif-colorspace": "Түс кеңістігі",
        "exif-componentsconfiguration": "Әрқайсы құраш мәні",
        "exif-compressedbitsperpixel": "Сурет қысымдау тәртібі",
-       "exif-pixelydimension": "Сурет ені",
-       "exif-pixelxdimension": "Сурет биіктігі",
+       "exif-pixelxdimension": "Сурет ені",
+       "exif-pixelydimension": "Сурет биіктігі",
        "exif-usercomment": "Қатысушы пікірі",
        "exif-relatedsoundfile": "Қатысты дыбыс файлы",
        "exif-datetimeoriginal": "Жасалған кезі",
        "redirect-not-exists": "Мән табылмады",
        "fileduplicatesearch": "Файл телнұсқаларын іздеу",
        "fileduplicatesearch-summary": "Файл хеші мағынасы негізінде телнұсқаларын іздеу.",
-       "fileduplicatesearch-legend": "Телнұсқаны іздеу",
        "fileduplicatesearch-filename": "Файл атауы:",
        "fileduplicatesearch-submit": "Іздеу",
        "fileduplicatesearch-info": "$1 × $2 пиксел (нүкте)<br />Файл өлшемі: $3<br />MIME түрі: $4",
index b4a3d52..011e3ed 100644 (file)
        "exif-colorspace": "Tüs ayası",
        "exif-componentsconfiguration": "Ärqaýsı quraş mäni",
        "exif-compressedbitsperpixel": "Swret qısımdaw tärtibi",
-       "exif-pixelydimension": "Swrettiñ jaramdı eni",
-       "exif-pixelxdimension": "Swrettiñ jaramdı bïiktigi",
+       "exif-pixelxdimension": "Swrettiñ jaramdı eni",
+       "exif-pixelydimension": "Swrettiñ jaramdı bïiktigi",
        "exif-usercomment": "Qatıswşınıñ mändemeleri",
        "exif-relatedsoundfile": "Qatıstı dıbıs faýlı",
        "exif-datetimeoriginal": "Jasalğan kezi",
index e298a98..4a32fe1 100644 (file)
        "exif-flashpixversion": "បានគាំទ្រ កំណែ Flashpix",
        "exif-colorspace": "លំហពណ៌",
        "exif-compressedbitsperpixel": "កម្រិតហាប់ នៃរូបភាព (ប៊ិត/ចំណុច)",
-       "exif-pixelydimension": "ទទឹងរូបភាព",
-       "exif-pixelxdimension": "កម្ពស់រូបភាព",
+       "exif-pixelxdimension": "ទទឹងរូបភាព",
+       "exif-pixelydimension": "កម្ពស់រូបភាព",
        "exif-usercomment": "យោបល់របស់អ្នកប្រើប្រាស់",
        "exif-relatedsoundfile": "ឯកសារសំឡេងពាក់ព័ន្ធ",
        "exif-datetimeoriginal": "ពេលវេលានិងកាលបរិច្ឆេទបង្កើតទិន្នន័យ",
index a090015..deda865 100644 (file)
@@ -26,7 +26,8 @@
                        "Pavanaja",
                        "Ananth subray",
                        "MarcoAurelio",
-                       "Macofe"
+                       "Macofe",
+                       "రహ్మానుద్దీన్"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "welcomeuser": "ಸುಸ್ವಾಗತ,$1!",
        "welcomecreation-msg": "ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.",
        "yourname": "ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು",
-       "userlogin-yourname": "ಬಳಕೆದಾರ ಹೆಸರು",
+       "userlogin-yourname": "ಬಳಕೆದಾರ ಹೆಸರು",
        "userlogin-yourname-ph": "ನಿಮ್ಮ ಸದಸ್ಯನಾಮ ಬರೆಯಿರಿ",
        "createacct-another-username-ph": "ಬಳಕೆದಾರರ ಹೆಸರು ಬರೆಯಿರಿ",
        "yourpassword": "ನಿಮ್ಮ ಪ್ರವೇಶಪದ",
        "resetpass-recycled": "ದಯವಿಟ್ಟು ಈಗಿನ ಪ್ರವೇಶಪದದ ಬದಲು ಹೊಸಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಿ ಮರುಚಾಲನೆ ನೀಡಿ.",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
        "passwordreset": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ.",
-       "passwordreset-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
+       "passwordreset-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
        "passwordreset-domain": "ಕ್ಷೇತ್ರ:",
        "passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
        "passwordreset-emailsentemail": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.",
        "usereditcount": "$1{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಗಳು}}",
        "usercreated": "$1 ರಂದು $2 ಸಮಯಕ್ಕೆ {{GENDER:$3|ಸೃಷ್ಟಿಸಿದರು}}",
        "newpages": "ಹೊಸ ಪುಟಗಳು",
-       "newpages-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
+       "newpages-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
        "ancientpages": "ಹಳೆಯ ಪುಟಗಳು",
        "move": "ಸ್ಥಳಾಂತರಿಸಿ",
        "movethispage": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "usermaildisabled": "ಬಳಕೆದಾರರ ಮಿಂಚಂಚೆಯನ್ನು ನಿಷ್ಕ್ತಿಯಗೊಳಿಸಲಾಗಿದೆ",
        "noemailtitle": "ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇಲ್ಲ",
        "noemailtext": "ಈ ಸದಸ್ಯ ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿಲ್ಲ, ಅಥವ ಬೇರೆ ಸದಸ್ಯರಿಂದ ಇ-ಅಂಚೆ ಪಡೆಯಲು ಒಪ್ಪಿಕೊಂಡಿಲ್ಲ.",
-       "emailusername": "ಬಳಕೆದಾರ ಹೆಸರು:",
+       "emailusername": "ಬಳಕೆದಾರ ಹೆಸರು:",
        "emailusernamesubmit": "ಒಪ್ಪಿಸು",
        "emailfrom": "ಇಂದ:",
        "emailto": "ಗೆ:",
        "exif-artist": "ಕರ್ತೃ",
        "exif-copyright": "ಕೃತಿಸ್ವಾಮ್ಯತೆಯನ್ನು ಹೊಂದಿರುವವರು",
        "exif-exifversion": "Exif ಆವೃತ್ತಿ",
-       "exif-pixelydimension": "ಭಾವಚಿತ್ರದ ಅಗಲ",
-       "exif-pixelxdimension": "ಭಾವಚಿತ್ರದ ಎತ್ತರ",
+       "exif-pixelxdimension": "ಭಾವಚಿತ್ರದ ಅಗಲ",
+       "exif-pixelydimension": "ಭಾವಚಿತ್ರದ ಎತ್ತರ",
        "exif-usercomment": "ಬಳಕೆದಾರನ ಟಿಪ್ಪಣಿ",
        "exif-relatedsoundfile": "ಸಂಬಂಧಿತ ಧ್ವನಿ ಫೈಲು",
        "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾದ ದಿನಾಂಕ ಮತ್ತು ಕಾಲ",
        "redirect-page": "ಪುಟದ ID",
        "redirect-file": "ಕಡತದ ಹೆಸರು",
        "fileduplicatesearch": "ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು",
-       "fileduplicatesearch-legend": "ದ್ವಿಪ್ರತಿಯನ್ನು ಹುಡುಕು",
        "fileduplicatesearch-filename": "ಫೈಲಿನ ಹೆಸರು:",
        "fileduplicatesearch-submit": "ಹುಡುಕು",
        "fileduplicatesearch-info": "$1 × $2 ಚಿತ್ರಬಿಂದು<br />ಫೈಲಿನ ಗಾತ್ರ: $3<br />MIME ಪ್ರಕಾರ: $4",
index b8106eb..f4ab9e7 100644 (file)
        "exif-colorspace": "색 공간",
        "exif-componentsconfiguration": "각 구성 요소의 의미",
        "exif-compressedbitsperpixel": "그림 압축 방식",
-       "exif-pixelydimension": "그림 너비",
-       "exif-pixelxdimension": "그림 높이",
+       "exif-pixelxdimension": "그림 너비",
+       "exif-pixelydimension": "그림 높이",
        "exif-usercomment": "사용자 주",
        "exif-relatedsoundfile": "관련된 오디오 파일",
        "exif-datetimeoriginal": "날짜와 시간",
        "redirect-not-exists": "값을 찾을 수 없습니다",
        "fileduplicatesearch": "중복된 파일 검색",
        "fileduplicatesearch-summary": "파일 해시값을 이용해 중복 파일을 검색합니다.",
-       "fileduplicatesearch-legend": "중복 검색",
        "fileduplicatesearch-filename": "파일 이름:",
        "fileduplicatesearch-submit": "검색",
        "fileduplicatesearch-info": "$1 × $2 픽셀<br />파일 크기: $3<br />MIME 유형: $4",
index dd0a5b2..f8f15e1 100644 (file)
        "exif-colorspace": "Бояу алам",
        "exif-componentsconfiguration": "Хар компонентни ангыламы",
        "exif-compressedbitsperpixel": "Суратны къысдырыу амалы",
-       "exif-pixelydimension": "Суратны кенглиги",
-       "exif-pixelxdimension": "Суратны мийиклиги",
+       "exif-pixelxdimension": "Суратны кенглиги",
+       "exif-pixelydimension": "Суратны мийиклиги",
        "exif-usercomment": "Къошакъ комментарий",
        "exif-relatedsoundfile": "Тауушлу комментарийни файлы",
        "exif-datetimeoriginal": "Оригинал джаратыу заман",
index 61c64b7..f7c2f4c 100644 (file)
        "exif-colorspace": "Färveroum",
        "exif-componentsconfiguration": "Bedüggening fun all de enkele Komponente",
        "exif-compressedbitsperpixel": "Aat fun de Kompreßjohn fun däm Beld",
-       "exif-pixelydimension": "De jöltije Beld-Breede en Pixelle",
-       "exif-pixelxdimension": "De jöltije Beld-Hühde en Pixelle",
+       "exif-pixelxdimension": "De jöltije Beld-Breede en Pixelle",
+       "exif-pixelydimension": "De jöltije Beld-Hühde en Pixelle",
        "exif-usercomment": "Aanmerkong fum Aanwender",
        "exif-relatedsoundfile": "De Tondatei, di do bei jehööt",
        "exif-datetimeoriginal": "Zickpunk fun de Opzeischnong fun de Date",
        "redirect-not-exists": "Nit jefonge",
        "fileduplicatesearch": "Sök noh dubbelte Dateie",
        "fileduplicatesearch-summary": "Söhhk noh dubbelte Dateie övver dänne iere Häsh-Zahl.",
-       "fileduplicatesearch-legend": "Sök noh ene dubbelte Dattei",
        "fileduplicatesearch-filename": "Datteinahme:",
        "fileduplicatesearch-submit": "Söhke",
        "fileduplicatesearch-info": "{{PLURAL:$1|Ei Pixel|$1 Pixelle|Nit}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle|nix}} huh<br />Dateiömfang: $3<br />de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Multi-Purpose Internet Mail Extensions\">MIME</i>-Zoot: <code>$4</code>",
index 9499c11..514ba4d 100644 (file)
        "exif-software": "Nivîsbarîya tê bikaranîn",
        "exif-artist": "Nûser",
        "exif-exifversion": "Versiyona exif",
-       "exif-pixelydimension": "Firehiya wêne",
-       "exif-pixelxdimension": "Dirêjiya wêne",
+       "exif-pixelxdimension": "Firehiya wêne",
+       "exif-pixelydimension": "Dirêjiya wêne",
        "exif-usercomment": "Şîroveyên bikarhêner",
        "exif-datetimedigitized": "Dema pencekîkirinê",
        "exif-exposuretime-format": "$1 sanî ($2)",
index 8c5fa95..1b879d5 100644 (file)
        "exif-imagelength": "Бийиктиги",
        "exif-imagedescription": "Сүрөт аты",
        "exif-artist": "Автор",
-       "exif-pixelydimension": "Сүрөттүн туурасы",
-       "exif-pixelxdimension": "Сүрөттүн бийиктиги",
+       "exif-pixelxdimension": "Сүрөттүн туурасы",
+       "exif-pixelydimension": "Сүрөттүн бийиктиги",
        "exif-usercomment": "Колдонуучунун комментарийи",
        "exif-relatedsoundfile": "Байланыштуу аудио-файл",
        "exif-fnumber": "Диафрагманын саны",
index 8be49c9..014a9b8 100644 (file)
@@ -26,7 +26,8 @@
                        "StevenJ81",
                        "Macofe",
                        "Xð",
-                       "Laurentianus"
+                       "Laurentianus",
+                       "Guillermo2149"
                ]
        },
        "tog-underline": "Versores linea denotandi:",
@@ -73,6 +74,8 @@
        "underline-default": "Defalta navigatri interretialis",
        "editfont-style": "Stilus:",
        "editfont-default": "iuxta navigatrum",
+       "editfont-sansserif": "Fons Sans-serif",
+       "editfont-serif": "Fons Serif",
        "sunday": "dies Solis",
        "monday": "dies Lunae",
        "tuesday": "dies Martis",
        "october-date": "$1 Octobris",
        "november-date": "$1 Novembris",
        "december-date": "$1 Decembris",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categoria|Categoriae}}",
        "category_header": "Paginae in categoria \"$1\"",
        "subcategories": "Subcategoriae",
        "morenotlisted": "Hic index mancus est.",
        "mypage": "Pagina",
        "mytalk": "Disputatio",
-       "anontalk": "Disputatio huius IP",
+       "anontalk": "Disputatio",
        "navigation": "Navigatio",
        "and": "&#32;et",
        "qbfind": "Invenire",
        "hidetoc": "celare",
        "collapsible-collapse": "Collabi",
        "collapsible-expand": "Dilatare",
+       "confirmable-yes": "Sic",
        "thisisdeleted": "Videre aut restituere $1?",
        "viewdeleted": "Visne conspicere $1?",
        "restorelink": "{{PLURAL:$1|unam redactionem deletam|$1 redactiones deletas}}",
        "exif-artist": "Auctor",
        "exif-exifversion": "Redactio modi \"Exif\"",
        "exif-colorspace": "Spatium colorimetricum",
-       "exif-pixelydimension": "Amplitudo imaginis",
-       "exif-pixelxdimension": "Altitudo imaginis",
+       "exif-pixelxdimension": "Amplitudo imaginis",
+       "exif-pixelydimension": "Altitudo imaginis",
        "exif-usercomment": "Adnota usoris",
        "exif-relatedsoundfile": "Fasciculus soni relatus",
        "exif-datetimeoriginal": "Dies et tempus creationis",
        "version-license": "Permissio",
        "version-software-product": "Productum",
        "version-software-version": "Versio",
-       "fileduplicatesearch-legend": "Duplicatum quaerere",
        "fileduplicatesearch-filename": "Fasciculi nomen:",
        "fileduplicatesearch-submit": "Quaerere",
        "fileduplicatesearch-info": "$1 × $2 elementa imaginalia<br />Magnitudo fasciculi: $3<br />Typus MIME: $4",
index d9ba73a..546eb37 100644 (file)
        "noemail": "De Benotzer \"$1\" huet keng E-Mail-Adress uginn.",
        "noemailcreate": "Dir musst eng valabel E-Mail-Adress uginn",
        "passwordsent": "Een neit Passwuert gouf un déi fir de Benotzer \"$1\" gespäichert E-Mailadress geschéckt.\nMellt Iech w.e.g. domat un, soubal Dir et kritt hutt.",
-       "blocked-mailpassword": "Déi vun Iech benotzten IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert unzefroen och gespaart.",
+       "blocked-mailpassword": "Är IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert vun dëser IP-Adress aus unzefroen och gespaart.",
        "eauthentsent": "Eng Confirmatiouns-E-Mail gouf un déi Adress geschéckt déi Dir uginn hutt.\n\nIer iergendeng E-Mail vun anere Benotzer op dee Kont geschéckt ka ginn, musst Dir als éischt d'Instructiounen an der Confirmatiouns-E-Mail befollegen, fir ze bestätegen datt de Kont wierklech Ären eegenen ass.",
        "throttled-mailpassword": "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} eng E-Mail verschéckt fir d'Passwuert zréckzesetzen.\nFir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} sou eng Mail verschéckt ginn.",
        "mailerror": "Feeler beim Schécke vun der E-Mail: $1",
        "gender-unknown": "Wann Dir ernimmt gitt da benotzt d'Software do wou et méiglech ass geschlechtsneutral Wierder",
        "gender-male": "Hien ännert Wikisäiten",
        "gender-female": "Si ännert Wikisäiten",
-       "prefs-help-gender": "Fakultativ:\nD'Software benotzt seng Wäerter fir Iech unzeschwätzen a fir vun Iech vis-a-vis vun Aneren grammatesch ''Gender-korrekt'' ze schwätzen. \n\nDës Informatioun ass ëffentlech.",
+       "prefs-help-gender": "Fakultativ:\nD'Software benotzt seng Wäerter fir Iech unzerieden a fir vun Iech vis-a-vis vun Anere grammatesch ''Gender-korrekt'' ze sinn. \n\nDës Informatioun ass ëffentlech.",
        "email": "E-Mail",
        "prefs-help-realname": "De richtegen Numm ass fakultativ.\nWann en ugi gouf, gëtt e benotzt fir Iech Är Kontributiounen zouzeuerdnen.",
        "prefs-help-email": "D'E-Mailadress ass fakultativ, awer si gëtt gebraucht fir Iech Äert Passwuert ze mailen, wann Dir et géift vergiessen.",
        "ipb-unblock": "Spär vun enger IP-Adress oder engem Benotzer ophiewen",
        "ipb-blocklist": "Kuckt aktuell Spären",
        "ipb-blocklist-contribs": "Kontributioune vum {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 iwwreg",
        "unblockip": "Spär vum Benotzer ophiewen",
        "unblockiptext": "Benotzt dëse Formulaire fir enger IP-Adress oder engem Benotzer seng Spär opzehiewen.",
        "ipusubmit": "Des Spär ophiewen",
        "exif-colorspace": "Faarfraum",
        "exif-componentsconfiguration": "Bedeitung vun eenzelne Komponenten",
        "exif-compressedbitsperpixel": "Kompriméiert Bite pro Pixel",
-       "exif-pixelydimension": "Breet vum Bild",
-       "exif-pixelxdimension": "Héicht vum Bild",
+       "exif-pixelxdimension": "Breet vum Bild",
+       "exif-pixelydimension": "Héicht vum Bild",
        "exif-usercomment": "Bemierkunge vum Benotzer",
        "exif-relatedsoundfile": "Tounfichier deen dozou gehéiert",
        "exif-datetimeoriginal": "Erfaassungszäitpunkt",
        "redirect-not-exists": "Wäert net fonnt",
        "fileduplicatesearch": "No duebele Fichiere sichen",
        "fileduplicatesearch-summary": "Sichen no Doublone vu Fichieren op der Basis vun hirem ''Hash-Wäert''.",
-       "fileduplicatesearch-legend": "No engem Doublon sichen",
        "fileduplicatesearch-filename": "Numm vum Fichier:",
        "fileduplicatesearch-submit": "Sichen",
        "fileduplicatesearch-info": "$1 × $2 Pixel<br />Gréisst vum Fichier: $3<br />MIME Typ: $4",
        "logentry-newusers-autocreate": "De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}",
        "logentry-protect-protect": "$1 {{GENDER:$2|huet}} d'Säit $3 $4 gespaart",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|huet}} d'Säit $3 $4 gepaart [Kaskadespär]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert vu(n) $4 op $5 geännert",
+       "logentry-rights-rights": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen {{GENDER:$3|d'|de}} $3 gehéiert vu(n) $4 op $5 geännert",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert geännert",
        "logentry-rights-autopromote": "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
        "logentry-upload-upload": "$1 huet $3 {{GENDER:$2|eropgelueden}}",
index 4684903..748c9d0 100644 (file)
        "exif-colorspace": "Kläörruumde",
        "exif-componentsconfiguration": "Beteikenis van edere componènt",
        "exif-compressedbitsperpixel": "Cómpressiemeneer bie dit plaetje",
-       "exif-pixelydimension": "Aafbeildingsbrèdje",
-       "exif-pixelxdimension": "Aafbeildingsheugdje",
+       "exif-pixelxdimension": "Aafbeildingsbrèdje",
+       "exif-pixelydimension": "Aafbeildingsheugdje",
        "exif-usercomment": "Opmerkinge",
        "exif-relatedsoundfile": "Biebeheurendj audiobestandj",
        "exif-datetimeoriginal": "Datum en momint van verwèkking",
index 35c9724..9c11f7c 100644 (file)
        "exif-colorspace": "فضای رۀنگی",
        "exif-componentsconfiguration": "معنی هر یک از مؤلفه‌ها",
        "exif-compressedbitsperpixel": "حالت فشرده‌سازی تصویر",
-       "exif-pixelydimension": "پهنای تصویر",
-       "exif-pixelxdimension": "بلندی تصویر",
+       "exif-pixelxdimension": "پهنای تصویر",
+       "exif-pixelydimension": "بلندی تصویر",
        "exif-usercomment": "توضیحات کاربر",
        "exif-relatedsoundfile": "پروندهٔ صوتی مربوط",
        "exif-datetimeoriginal": "تاریخ و زمان تولید داده‌ها",
index 3fd7e2f..ab7b410 100644 (file)
        "exif-colorspace": "رئن ورگه",
        "exif-componentsconfiguration": "مئنی هر اندوم",
        "exif-compressedbitsperpixel": "شکل جمع و جیل کردن عسگ",
-       "exif-pixelydimension": "پئنا عسگ",
-       "exif-pixelxdimension": "درازا عسگ",
+       "exif-pixelxdimension": "پئنا عسگ",
+       "exif-pixelydimension": "درازا عسگ",
        "exif-usercomment": "ویر و باوریا کارور",
        "exif-relatedsoundfile": "جانیا دنگ دار مرتوط",
        "exif-datetimeoriginal": "دمون و وخت راس بیئن دونسمنیا",
index c0b33b8..c2529dd 100644 (file)
        "exif-colorspace": "Spalvų pristatymas",
        "exif-componentsconfiguration": "kiekvieno komponento reikšmė",
        "exif-compressedbitsperpixel": "Paveikslėlio suspaudimo režimas",
-       "exif-pixelydimension": "Paveikslėlio plotis",
-       "exif-pixelxdimension": "Vaizdo aukštis",
+       "exif-pixelxdimension": "Paveikslėlio plotis",
+       "exif-pixelydimension": "Vaizdo aukštis",
        "exif-usercomment": "Naudotojo komentarai",
        "exif-relatedsoundfile": "Susijusi garso byla",
        "exif-datetimeoriginal": "Duomenų generavimo data ir laikas",
index 1a5e27b..309ccd4 100644 (file)
        "exif-colorspace": "Rawng hmun",
        "exif-componentsconfiguration": "Péngtinte awmzia",
        "exif-compressedbitsperpixel": "Lem sàwrzìmphung",
-       "exif-pixelydimension": "Lem zauzáwng",
-       "exif-pixelxdimension": "Lem sànzáwng",
+       "exif-pixelxdimension": "Lem zauzáwng",
+       "exif-pixelydimension": "Lem sànzáwng",
        "exif-usercomment": "Hmangtu kamchhuak",
        "exif-relatedsoundfile": "Ritaksa laichinte",
        "exif-datetimeoriginal": "Hriattirna siamchhuah hun leh ni",
index c6ee2aa..008168f 100644 (file)
        "exif-colorspace": "Krāsu telpa",
        "exif-componentsconfiguration": "Katras sastāvdaļas nozīme",
        "exif-compressedbitsperpixel": "Attēla kompresijas pakāpe",
-       "exif-pixelydimension": "Attēla platums",
-       "exif-pixelxdimension": "Attēla augstums",
+       "exif-pixelxdimension": "Attēla platums",
+       "exif-pixelydimension": "Attēla augstums",
        "exif-usercomment": "Lietotāja komentāri",
        "exif-relatedsoundfile": "Saistītais skaņas fails",
        "exif-datetimeoriginal": "Izveidošanas datums un laiks",
        "redirect-not-exists": "Vērtība nav atrasta",
        "fileduplicatesearch": "Meklēt failu kopijas",
        "fileduplicatesearch-summary": "Meklē dublējošos failus, izmantojot uz jaucējfunkcijas vērtības.",
-       "fileduplicatesearch-legend": "Meklēt kopiju",
        "fileduplicatesearch-filename": "Faila vārds:",
        "fileduplicatesearch-submit": "Meklēt",
        "fileduplicatesearch-info": "$1 × $2 pikseļi<br />Faila izmērs: $3<br />MIME tips: $4",
index dbcd528..d4bd82c 100644 (file)
        "exif-colorspace": "रंगक स्थान",
        "exif-componentsconfiguration": "सभ घटकक अर्थ",
        "exif-compressedbitsperpixel": "चित्र संकुचन अवस्था",
-       "exif-pixelydimension": "तस्वीरक चौडाई",
-       "exif-pixelxdimension": "तस्वीरक ऊँचाई",
+       "exif-pixelxdimension": "तस्वीरक चौडाई",
+       "exif-pixelydimension": "तस्वीरक ऊँचाई",
        "exif-usercomment": "सदस्यक टिप्पणी",
        "exif-relatedsoundfile": "संबंधित ध्वनि फ़ाईल",
        "exif-datetimeoriginal": "डाटा बनाबैक तारीख आ समय",
index e5169da..e6d20bd 100644 (file)
        "exif-colorspace": "Тюсонь ёткась",
        "exif-componentsconfiguration": "Эрь компонентонь асуц",
        "exif-compressedbitsperpixel": "Архтофксонь компрезийамась",
-       "exif-pixelydimension": "Кондясти архтофксонь келец",
-       "exif-pixelxdimension": "Кондясти архтофксонь серец",
+       "exif-pixelxdimension": "Кондясти архтофксонь келец",
+       "exif-pixelydimension": "Кондясти архтофксонь серец",
        "exif-usercomment": "Тиить тяштьксонза",
        "exif-relatedsoundfile": "Сотф аудио файлсь",
        "exif-datetimeoriginal": "Шинь тиевомать шись ди пингсь",
index 7468ee4..f1b3a37 100644 (file)
        "exif-colorspace": "Valan-doko",
        "exif-componentsconfiguration": "Dikan'ny mpanorina tsirairay",
        "exif-compressedbitsperpixel": "Fomba famintinan-tsary",
-       "exif-pixelydimension": "Haavon-tsary",
-       "exif-pixelxdimension": "Halala-tsary",
+       "exif-pixelxdimension": "Haavon-tsary",
+       "exif-pixelydimension": "Halala-tsary",
        "exif-usercomment": "Diniky ny mpikambana",
        "exif-relatedsoundfile": "Rakitra audio miaraka",
        "exif-datetimeoriginal": "Daty fangalana niaviana",
index f55d378..68716bc 100644 (file)
        "exif-colorspace": "Ruang warna",
        "exif-componentsconfiguration": "Arti tiok komponen",
        "exif-compressedbitsperpixel": "Mode kompresi gamba",
-       "exif-pixelydimension": "Leba gamba",
-       "exif-pixelxdimension": "Tinggi gamba",
+       "exif-pixelxdimension": "Leba gamba",
+       "exif-pixelydimension": "Tinggi gamba",
        "exif-usercomment": "Komen pangguno",
        "exif-relatedsoundfile": "Berkas audio nan bahubuangan",
        "namespacesall": "sadonyo",
index 1d68d63..8675f12 100644 (file)
        "shared-repo": "заедничко складиште",
        "shared-repo-name-wikimediacommons": "Ризницата",
        "filepage.css": "/* Тука поставените каскадни стилски страници (CSS) се вклучени во описната страница на податотеката, како и на клиентските викија */",
-       "upload-disallowed-here": "Ð\9dажалоÑ\81Ñ\82, не можете да презапишете врз сликава.",
+       "upload-disallowed-here": "Ð\97а Ð¶Ð°Ð», не можете да презапишете врз сликава.",
        "filerevert": "Врати $1",
        "filerevert-legend": "Врати податотека",
        "filerevert-intro": "Ја враќате '''[[Media:$1|$1]]''' на [$4 верзијата од $3, $2].",
        "import-logentry-upload-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}}",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Увезена е една преработка|Увезени се $1 преработки}} од $2",
        "javascripttest": "Проба на JavaScript",
-       "javascripttest-pagetext-noframework": "Оваа страница е резервирана за вршење на проби со JavaScript.",
-       "javascripttest-pagetext-unknownframework": "Непозната рамка „$1“.",
        "javascripttest-pagetext-unknownaction": "Непознато дејство „$1“.",
-       "javascripttest-pagetext-frameworks": "Изберете една од следниве рамки: $1",
-       "javascripttest-pagetext-skins": "Одберете со кое руво да ја направите пробата:",
        "javascripttest-qunit-intro": "Вид. [$1 документација на испробувањето] на mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Вашата}} корисничка страница",
        "tooltip-pt-anonuserpage": "Корисничка страница за IP-адресата од која уредувате",
        "exif-colorspace": "Боен простор",
        "exif-componentsconfiguration": "Значење на секој боен дел",
        "exif-compressedbitsperpixel": "Режим на набивање на сликата",
-       "exif-pixelydimension": "Ширина на сликата",
-       "exif-pixelxdimension": "Висина на сликата",
+       "exif-pixelxdimension": "Ширина на сликата",
+       "exif-pixelydimension": "Висина на сликата",
        "exif-usercomment": "Кориснички коментари",
        "exif-relatedsoundfile": "Поврзана аудиоснимка",
        "exif-datetimeoriginal": "Датум и време на сликање",
        "version-libraries-description": "Опис",
        "version-libraries-authors": "Автори",
        "redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
-       "redirect-legend": "Пренасочување кон податотека или страница",
        "redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Дај",
        "redirect-lookup": "Пребарај:",
        "redirect-not-exists": "Вредноста не е најдена",
        "fileduplicatesearch": "Барање на дуплирани податотеки",
        "fileduplicatesearch-summary": "Пребарување на дуплирани податотеки по тарабни вредности.",
-       "fileduplicatesearch-legend": "Барање на дупликат",
        "fileduplicatesearch-filename": "Податотека:",
        "fileduplicatesearch-submit": "Барај",
        "fileduplicatesearch-info": "$1 × $2 пиксели<br />Големина на податотеката: $3<br />MIME-тип: $4",
index 0f9afb9..6283267 100644 (file)
        "exif-colorspace": "കളർ സ്പേസ്",
        "exif-componentsconfiguration": "ഓരോ ഘടകത്തിന്റേയും അർത്ഥം",
        "exif-compressedbitsperpixel": "ചിത്രം ചുരുക്കുവാനുപയോഗിച്ചിരിക്കുന്ന മാർഗ്ഗം",
-       "exif-pixelydimension": "ചിത്രത്തിന്റെ വീതി",
-       "exif-pixelxdimension": "ചിത്രത്തിന്റെ ഉയരം",
+       "exif-pixelxdimension": "ചിത്രത്തിന്റെ വീതി",
+       "exif-pixelydimension": "ചിത്രത്തിന്റെ ഉയരം",
        "exif-usercomment": "ഉപയോക്താവിന്റെ കുറിപ്പുകൾ",
        "exif-relatedsoundfile": "ഇതുമായി ബന്ധമുള്ള ഓഡിയോ പ്രമാണം",
        "exif-datetimeoriginal": "ഡാറ്റ സൃഷ്ടിക്കപ്പെട്ട തീയതിയും സമയവും",
index 89929c0..abe9087 100644 (file)
        "exif-colorspace": "Өнгөний завсар",
        "exif-componentsconfiguration": "Бүх бүрэлдэхүүн хэсгүүдийн утга",
        "exif-compressedbitsperpixel": "Зургийн файлыг шахах арга",
-       "exif-pixelydimension": "Зургийн өргөн",
-       "exif-pixelxdimension": "Зургийн өндөр",
+       "exif-pixelxdimension": "Зургийн өргөн",
+       "exif-pixelydimension": "Зургийн өндөр",
        "exif-usercomment": "Хэрэглэгчдийн тэмдэглэл",
        "exif-relatedsoundfile": "Холбоотой дуун файл",
        "exif-datetimeoriginal": "Мэдээллийг үүсгэсэн огноо ба цаг",
index 2ba3513..998817a 100644 (file)
        "exif-colorspace": "रंगांकन (कलर स्पेस)",
        "exif-componentsconfiguration": "प्रत्येक घटकाचा अर्थ",
        "exif-compressedbitsperpixel": "चित्र आकुंचन स्थिती",
-       "exif-pixelydimension": "आकृतीची सुयोग्य रूंदी",
-       "exif-pixelxdimension": "आकृतीची सुयोग्य उंची",
+       "exif-pixelxdimension": "आकृतीची सुयोग्य रूंदी",
+       "exif-pixelydimension": "आकृतीची सुयोग्य उंची",
        "exif-usercomment": "सदस्य प्रतिक्रीया",
        "exif-relatedsoundfile": "संबधीत ध्वनी संचिका",
        "exif-datetimeoriginal": "विदा निर्मितीची तारीख आणि वेळ",
index d29a55d..ec59953 100644 (file)
        "exif-colorspace": "Ruang warna",
        "exif-componentsconfiguration": "Maksud setiap komponen",
        "exif-compressedbitsperpixel": "Mod pemampatan imej",
-       "exif-pixelydimension": "Lebar imej",
-       "exif-pixelxdimension": "Tinggi imej",
+       "exif-pixelxdimension": "Lebar imej",
+       "exif-pixelydimension": "Tinggi imej",
        "exif-usercomment": "Komen pengguna",
        "exif-relatedsoundfile": "Fail audio berkaitan",
        "exif-datetimeoriginal": "Tarikh dan waktu penjanaan data",
index f09f565..8e3780b 100644 (file)
        "exif-colorspace": "Spazju tal-kuluri",
        "exif-componentsconfiguration": "Tfissira dwar kull komponent",
        "exif-compressedbitsperpixel": "Għamla tal-kompressjoni tal-istampa",
-       "exif-pixelydimension": "Wisa' tal-istampa",
-       "exif-pixelxdimension": "Għoli tal-istama",
+       "exif-pixelxdimension": "Wisa' tal-istampa",
+       "exif-pixelydimension": "Għoli tal-istama",
        "exif-usercomment": "Noti tal-utent",
        "exif-relatedsoundfile": "Fajl relatat mal-ismiegħ",
        "exif-datetimeoriginal": "Data u ħin tal-ħolqien tad-data",
index 3e8e28f..f94f79c 100644 (file)
        "exif-copyright": "မူပိုင်ခွင့်ပိုင်ရှင်",
        "exif-exifversion": "Exif ဗားရှင်း",
        "exif-colorspace": "အရောင်နေရာ",
-       "exif-pixelydimension": "ပုံအကျယ်",
-       "exif-pixelxdimension": "ပုံအမြင့်",
+       "exif-pixelxdimension": "ပုံအကျယ်",
+       "exif-pixelydimension": "ပုံအမြင့်",
        "exif-usercomment": "အသုံးပြုသူ မှတ်ချက်များ",
        "exif-relatedsoundfile": "ဆက်နွယ်သော အသံဖိုင်",
        "exif-datetimeoriginal": "ဒေတာဖန်တီးခဲ့သော နေ့စွဲနှင့် အချိန်",
        "version-software-product": "ထုတ်ကုန်",
        "version-software-version": "ဗားရှင်း",
        "fileduplicatesearch": "နှစ်ခုထပ်နေသောဖိုင်များကို ရှာရန်",
-       "fileduplicatesearch-legend": "နှစ်ခုထပ်နေသည်ကို ရှာရန်",
        "fileduplicatesearch-filename": "ဖိုင်အမည် -",
        "fileduplicatesearch-submit": "ရှာဖွေရန်",
        "specialpages": "အ​ထူး ​စာ​မျက်​နှာ​များ",
index a1a9bb1..0ad8805 100644 (file)
        "exif-artist": "Теицязо",
        "exif-copyright": "Копия теемань видечинь кирдицясь",
        "exif-colorspace": "Тюс ютко",
-       "exif-pixelydimension": "Артовксонть келезэ",
-       "exif-pixelxdimension": "Артовксонть сэрезэ",
+       "exif-pixelxdimension": "Артовксонть келезэ",
+       "exif-pixelydimension": "Артовксонть сэрезэ",
        "exif-usercomment": "Теицянь мельть-арьсемат",
        "exif-exposuretime": "Валдомтомань (Экспозициянь) шка",
        "exif-fnumber": "Диафрагмань числась",
index 8e6132e..e9a257c 100644 (file)
        "exif-colorspace": "Spazio d' 'e culore",
        "exif-componentsconfiguration": "Significato d'ogne componente",
        "exif-compressedbitsperpixel": "Modo 'e compressione 'e l'immaggene",
-       "exif-pixelydimension": "Larghezza 'e l'immaggene",
-       "exif-pixelxdimension": "Autezza 'e l'immaggene",
+       "exif-pixelxdimension": "Larghezza 'e l'immaggene",
+       "exif-pixelydimension": "Autezza 'e l'immaggene",
        "exif-usercomment": "Note 'e ll'utente",
        "exif-relatedsoundfile": "File audio cullegato",
        "exif-datetimeoriginal": "Data e ora d' 'a criazione d' 'e date",
        "redirect-not-exists": "Valore nun accucchiato",
        "fileduplicatesearch": "Ascìa 'e file duprecate",
        "fileduplicatesearch-summary": "Circa pe' file duprecate cu bbase 'o valore hash.",
-       "fileduplicatesearch-legend": "Circa pe' nu duprecato",
        "fileduplicatesearch-filename": "Nomme d' 'o file",
        "fileduplicatesearch-submit": "Truova",
        "fileduplicatesearch-info": "$1 × $2 pixel, dimenzione d' 'o file: $3<br />tipo MIME: $4",
index 073fe88..1073491 100644 (file)
        "exif-colorspace": "Fargerom",
        "exif-componentsconfiguration": "Betydning av hver komponent",
        "exif-compressedbitsperpixel": "Bildekompresjonsmodus",
-       "exif-pixelydimension": "Bildebredde",
-       "exif-pixelxdimension": "Bildehøyde",
+       "exif-pixelxdimension": "Bildebredde",
+       "exif-pixelydimension": "Bildehøyde",
        "exif-usercomment": "Brukerkommentarer",
        "exif-relatedsoundfile": "Relatert lydfil",
        "exif-datetimeoriginal": "Dato og tid for datagenerering",
index 49ccbf8..f53d44c 100644 (file)
        "exif-colorspace": "Kleurruumte",
        "exif-componentsconfiguration": "Betekenisse van elk compenent",
        "exif-compressedbitsperpixel": "Beeldkompressiemethode",
-       "exif-pixelydimension": "Aofbeeldingsbreedte",
-       "exif-pixelxdimension": "Aofbeeldingsheugte",
+       "exif-pixelxdimension": "Aofbeeldingsbreedte",
+       "exif-pixelydimension": "Aofbeeldingsheugte",
        "exif-usercomment": "Opmarkingen",
        "exif-relatedsoundfile": "Biebeheurend geluudsbestaand",
        "exif-datetimeoriginal": "Tiedstip van datagenerasie",
        "redirect-not-exists": "Weerde niet evunnen",
        "fileduplicatesearch": "Dubbele bestaanden zeuken",
        "fileduplicatesearch-summary": "Dubbele bestaanden zeuken op baosis van de hashweerde.",
-       "fileduplicatesearch-legend": "Dubbele bestaanden zeuken",
        "fileduplicatesearch-filename": "Bestaandsnaam:",
        "fileduplicatesearch-submit": "Zeuken",
        "fileduplicatesearch-info": "$1 × $2 beeldpunten<br />Bestaandsgrootte: $3<br />MIME-type: $4",
index f83ab14..f21090f 100644 (file)
        "exif-colorspace": "Farvruum",
        "exif-componentsconfiguration": "Bedüden vun elk Kumponent",
        "exif-compressedbitsperpixel": "Komprimeerte Bits je Pixel",
-       "exif-pixelydimension": "Gellen Bildbreed",
-       "exif-pixelxdimension": "Gellen Bildhööchd",
+       "exif-pixelxdimension": "Gellen Bildbreed",
+       "exif-pixelydimension": "Gellen Bildhööchd",
        "exif-usercomment": "Brukerkommentar",
        "exif-relatedsoundfile": "Tohörige Toondatei",
        "exif-datetimeoriginal": "Tiet vun de Opnahm",
index ac0d25c..4d9877f 100644 (file)
        "exif-colorspace": "वर्ण स्थान",
        "exif-componentsconfiguration": "प्रत्येक घटकको अर्थ",
        "exif-compressedbitsperpixel": "चित्र सम्पीडन मोड",
-       "exif-pixelydimension": "चित्रको  चौड़ाई",
-       "exif-pixelxdimension": "चित्रको उचाई",
+       "exif-pixelxdimension": "चित्रको  चौड़ाई",
+       "exif-pixelydimension": "चित्रको उचाई",
        "exif-usercomment": "प्रयोगकर्ताका टिप्पणखरु:",
        "exif-relatedsoundfile": "सम्बन्धित अडियो फाइल",
        "exif-datetimeoriginal": "डेटा सञ्चालनको मिति र समय",
index 95b66b2..6dccabf 100644 (file)
        "exif-software": "छ्यलातःगु सफ्तवेयर",
        "exif-artist": "च्वमि",
        "exif-copyright": "लेखाधिकार थुवा",
-       "exif-pixelydimension": "किपा ब्याः",
-       "exif-pixelxdimension": "किपा जाः",
+       "exif-pixelxdimension": "किपा ब्याः",
+       "exif-pixelydimension": "किपा जाः",
        "exif-dc-date": "तिथि",
        "namespacesall": "सकल",
        "autosumm-new": "न्हुगु पौ: $1",
index acc2cd7..5d89216 100644 (file)
        "exif-colorspace": "Kleurruimte",
        "exif-componentsconfiguration": "Betekenis van elke component",
        "exif-compressedbitsperpixel": "Beeldcompressiemethode",
-       "exif-pixelydimension": "Afbeeldingsbreedte",
-       "exif-pixelxdimension": "Afbeeldingshoogte",
+       "exif-pixelxdimension": "Afbeeldingsbreedte",
+       "exif-pixelydimension": "Afbeeldingshoogte",
        "exif-usercomment": "Opmerkingen",
        "exif-relatedsoundfile": "Bijbehorend audiobestand",
        "exif-datetimeoriginal": "Tijdstip gegevensaanmaak",
index e050eb9..66d205d 100644 (file)
        "exif-colorspace": "Fargerom",
        "exif-componentsconfiguration": "Komponentanalyse",
        "exif-compressedbitsperpixel": "Komprimerte bits pr. pixel",
-       "exif-pixelydimension": "Biletbreidd",
-       "exif-pixelxdimension": "Bilethøgd",
+       "exif-pixelxdimension": "Biletbreidd",
+       "exif-pixelydimension": "Bilethøgd",
        "exif-usercomment": "Brukarkommentarar",
        "exif-relatedsoundfile": "Tilknytt lydfil",
        "exif-datetimeoriginal": "Dato og tid laga",
index 3a68073..41bbf8b 100644 (file)
        "exif-colorspace": "Espaci colorimetric",
        "exif-componentsconfiguration": "Significacion de cada compausanta",
        "exif-compressedbitsperpixel": "Mòde de compression de l’imatge",
-       "exif-pixelydimension": "Largor de l’imatge",
-       "exif-pixelxdimension": "Nautor de l’imatge",
+       "exif-pixelxdimension": "Largor de l’imatge",
+       "exif-pixelydimension": "Nautor de l’imatge",
        "exif-usercomment": "Comentaris de l'utilizaire",
        "exif-relatedsoundfile": "Fichièr àudio associat",
        "exif-datetimeoriginal": "Data e ora de la generacion de donadas",
index 221e87c..bb3707a 100644 (file)
        "exif-colorspace": "ରଙ୍ଗ ଫାଙ୍କା ଜାଗା",
        "exif-componentsconfiguration": "ପ୍ରତିତି ଉପାଦାନର ଅର୍ଥ",
        "exif-compressedbitsperpixel": "ଛବି ସଙ୍କୋଚନ ଅବସ୍ଥା",
-       "exif-pixelydimension": "ଛବି ଓସାର",
-       "exif-pixelxdimension": "ଛବି ଉଚ୍ଚତା",
+       "exif-pixelxdimension": "ଛବି ଓସାର",
+       "exif-pixelydimension": "ଛବି ଉଚ୍ଚତା",
        "exif-usercomment": "ସଭ୍ୟ ମତାମତ",
        "exif-relatedsoundfile": "ସମ୍ବନ୍ଧିତ ଶବ୍ଦ ଫାଇଲ",
        "exif-datetimeoriginal": "ତଥ୍ୟ ତିଆରିହେବାର ତାରିଖ ଓ ସମୟ",
index 407e9b9..a160c58 100644 (file)
        "exif-copyright": "ਕਾਪੀਰਾਈਟ ਟਾਇਟਲ",
        "exif-exifversion": "ਐਗਜ਼ਿਫ਼ ਦਾ ਰੂਪ",
        "exif-colorspace": "ਰੰਗ ਸਪੇਸ",
-       "exif-pixelydimension": "ਤਸਵੀਰ ਦੀ ਚੌੜਾਈ",
-       "exif-pixelxdimension": "ਤਸਵੀਰ ਦੀ ਲੰਬਾਈ",
+       "exif-pixelxdimension": "ਤਸਵੀਰ ਦੀ ਚੌੜਾਈ",
+       "exif-pixelydimension": "ਤਸਵੀਰ ਦੀ ਲੰਬਾਈ",
        "exif-usercomment": "ਵਰਤੋਂਕਾਰ ਦੀਆਂ ਟਿੱਪਣੀਆਂ",
        "exif-relatedsoundfile": "ਮਿਲਦੀ-ਜੁਲਦੀ ਆਡੀਓ ਫ਼ਾਈਲ",
        "exif-datetimeoriginal": "ਡਾਟਾ ਦੇ ਬਣਨ ਦੀ ਮਿਤੀ ਅਤੇ ਸਮਾਂ",
index 7060c0b..c9bf45c 100644 (file)
        "exif-colorspace": "Pirinan kule (color space)",
        "exif-componentsconfiguration": "Kabaldugan ning balang dake (component)",
        "exif-compressedbitsperpixel": "Paralan/ayus pamamitpit larawan (image compression mode)",
-       "exif-pixelydimension": "Ustung lapad ning larawan",
-       "exif-pixelxdimension": "Ustung katas ning larawan",
+       "exif-pixelxdimension": "Ustung lapad ning larawan",
+       "exif-pixelydimension": "Ustung katas ning larawan",
        "exif-usercomment": "Komentu da ring talagamit",
        "exif-relatedsoundfile": "Makaugneng simpan a katni (audio file)",
        "exif-datetimeoriginal": "Petsa ampong oras ning pamaglalang king data (data generation)",
index 5b22de3..4c791e9 100644 (file)
        "exif-colorspace": "Przestrzeń kolorów",
        "exif-componentsconfiguration": "Znaczenie składowych",
        "exif-compressedbitsperpixel": "Skompresowanych bitów na piksel",
-       "exif-pixelydimension": "Prawidłowa szerokość obrazu",
-       "exif-pixelxdimension": "Prawidłowa wysokość obrazu",
+       "exif-pixelxdimension": "Prawidłowa szerokość obrazu",
+       "exif-pixelydimension": "Prawidłowa wysokość obrazu",
        "exif-usercomment": "Komentarz użytkownika",
        "exif-relatedsoundfile": "Powiązany plik audio",
        "exif-datetimeoriginal": "Data i czas utworzenia oryginału",
        "redirect-not-exists": "Nie znaleziono wartości",
        "fileduplicatesearch": "Wyszukiwanie duplikatów pliku",
        "fileduplicatesearch-summary": "Wyszukiwanie duplikatów pliku na podstawie wartości funkcji skrótu.",
-       "fileduplicatesearch-legend": "Szukaj duplikatów pliku",
        "fileduplicatesearch-filename": "Nazwa pliku:",
        "fileduplicatesearch-submit": "Szukaj",
        "fileduplicatesearch-info": "$1 × $2 pikseli<br />Wielkość pliku: $3<br />Typ MIME: $4",
index 305806f..c76a11b 100644 (file)
        "exif-colorspace": "Spassi dij color",
        "exif-componentsconfiguration": "Significà ëd minca component",
        "exif-compressedbitsperpixel": "Sistema ëd compression dle figure",
-       "exif-pixelydimension": "Larghëssa dla figura",
-       "exif-pixelxdimension": "Autëssa dla figura",
+       "exif-pixelxdimension": "Larghëssa dla figura",
+       "exif-pixelydimension": "Autëssa dla figura",
        "exif-usercomment": "Nòte lìbere",
        "exif-relatedsoundfile": "Archivi sonor colegà",
        "exif-datetimeoriginal": "Data e ora dla generassion dij dat",
index 57c0b42..20dfd63 100644 (file)
        "exif-colorspace": "رنگ سپیس",
        "exif-componentsconfiguration": "ہر انگ دا مطلب",
        "exif-compressedbitsperpixel": "امیج کمپریشن موڈ",
-       "exif-pixelydimension": "امیج چوڑائی",
-       "exif-pixelxdimension": "امیج اچائی",
+       "exif-pixelxdimension": "امیج چوڑائی",
+       "exif-pixelydimension": "امیج اچائی",
        "exif-usercomment": "ورتن آلے دی صلاع",
        "exif-relatedsoundfile": "رلدی آڈیو فائل",
        "exif-datetimeoriginal": "تریخ تے ویلہ ڈیٹا جنریشن دا",
index 3a71cc6..cb2a061 100644 (file)
        "exif-colorspace": "Bārwis plattibi",
        "exif-componentsconfiguration": "Kōmpunēntin zentlisnā",
        "exif-compressedbitsperpixel": "Bildes kōmpresiōnis wīds",
-       "exif-pixelydimension": "Tikrōmiskan bildes plattu",
-       "exif-pixelxdimension": "Tikrōmiskan bildes aūktan",
+       "exif-pixelxdimension": "Tikrōmiskan bildes plattu",
+       "exif-pixelydimension": "Tikrōmiskan bildes aūktan",
        "exif-usercomment": "Tērpautajas kumentārai",
        "exif-relatedsoundfile": "Sēitan audiō zūrbrukis",
        "exif-datetimeoriginal": "Ōriginālas teīksnas dātan be kerdā",
index 228c091..228af6c 100644 (file)
        "exif-copyright": "د رښتو خاوند",
        "exif-exifversion": "Exif بڼه",
        "exif-colorspace": "رنگ تشيال",
-       "exif-pixelydimension": "د انځور سور",
-       "exif-pixelxdimension": "د انځور جگوالی",
+       "exif-pixelxdimension": "د انځور سور",
+       "exif-pixelydimension": "د انځور جگوالی",
        "exif-usercomment": "د کارن تبصرې",
        "exif-relatedsoundfile": "اړونده غږيزه دوتنه",
        "exif-datetimeoriginal": "د اومتوک د جوړېدنې وخت او نېټه",
index f2e1eb5..456e111 100644 (file)
        "exif-colorspace": "Espaço de cor",
        "exif-componentsconfiguration": "Significado de cada componente",
        "exif-compressedbitsperpixel": "Modo de compressão de imagem",
-       "exif-pixelydimension": "Largura da imagem",
-       "exif-pixelxdimension": "Altura da imagem",
+       "exif-pixelxdimension": "Largura da imagem",
+       "exif-pixelydimension": "Altura da imagem",
        "exif-usercomment": "Comentários de usuários",
        "exif-relatedsoundfile": "arquivo áudio relacionado",
        "exif-datetimeoriginal": "Data e hora de geração de dados",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Procurar por arquivos duplicados",
        "fileduplicatesearch-summary": "Procure por arquivos duplicados tendo por base seu valor \"hash\".",
-       "fileduplicatesearch-legend": "Procurar por duplicatas",
        "fileduplicatesearch-filename": "Nome do arquivo:",
        "fileduplicatesearch-submit": "Pesquisa",
        "fileduplicatesearch-info": "$1 × $2 pixels<br />Tamanho: $3<br />tipo MIME: $4",
index c592b28..eb05ee9 100644 (file)
        "listgrants-summary": "Esta é uma lista de atribuições com os respetivos acessos às permissões de utilizador. Os utilizadores podem autorizar aplicações a utilizar suas contas, mas com permissões limitadas baseadas nas atribuições dadas pelos utilizadores a cada aplicação. No entanto, uma aplicação agindo em nome de um utilizador não pode utilizar permissões que o utilizador não possui.\nPode haver [[{{MediaWiki:Listgrouprights-helppage}}|informação adicional]] sobre permissões individuais.",
        "listgrants-grant": "Atribuição",
        "listgrants-rights": "Direitos",
-       "trackingcategories": "Categorias de rastreamento",
+       "trackingcategories": "Categorias de monitorização",
        "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Os seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "exif-colorspace": "Espaço de cores",
        "exif-componentsconfiguration": "Significado de cada componente",
        "exif-compressedbitsperpixel": "Modo de compressão da imagem",
-       "exif-pixelydimension": "Largura válida da imagem",
-       "exif-pixelxdimension": "Altura válida da imagem",
+       "exif-pixelxdimension": "Largura válida da imagem",
+       "exif-pixelydimension": "Altura válida da imagem",
        "exif-usercomment": "Comentários de utilizadores",
        "exif-relatedsoundfile": "Ficheiro áudio relacionado",
        "exif-datetimeoriginal": "Data e hora de geração de dados",
        "redirect-not-exists": "Valor não encontrado",
        "fileduplicatesearch": "Ficheiros duplicados",
        "fileduplicatesearch-summary": "Procure ficheiros duplicados tendo por base o seu resumo criptográfico.",
-       "fileduplicatesearch-legend": "Procurar duplicados",
        "fileduplicatesearch-filename": "Ficheiro:",
        "fileduplicatesearch-submit": "Pesquisar",
        "fileduplicatesearch-info": "$1 × $2 pixels<br />Tamanho: $3<br />tipo MIME: $4",
index d0851bc..71dc9b7 100644 (file)
        "exif-colorspace": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe colorspace of the photo. This tells the computer how to make the colours in the photo be more true to the original photo. Typical values for this are sRGB or uncalibrated. This only gives information on colour information given in the exif-colorspace property. However, colour information is often stored elsewhere in the photo.\n\nSee also:\n* {{msg-mw|Exif-colorspace}}\n* {{msg-mw|Exif-colorspace-1|optional}}\n* {{msg-mw|Exif-colorspace-65535}}",
        "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
-       "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
-       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
+       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
+       "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
        "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practice utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
        "confirmemail_body_set": "This is used in a confirmation email sent when a contact email address is set.\n\nSee also [[MediaWiki:Confirmemail body changed]].\n\nParameters:\n* $1 - the IP address of the user that set the email address\n* $2 - the name of the user\n* $3 - a URL to [[Special:ConfirmEmail]]\n* $4 - a time and date (duplicated by $6 and $7)\n* $5 - a URL to [[Special:InvalidateEmail]]\n* $6 - (Optional) a date\n* $7 - (Optional) a time\n{{Related|Confirmemail body}}",
        "confirmemail_invalidated": "This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
        "invalidateemail": "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
+       "notificationemail_subject_changed": "Subject of the email sent on the previously registered email address notifying them about the change in the registered email address.",
+       "notificationemail_subject_removed": "Subject of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
+       "notificationemail_body_changed": "Body of the email sent on the previously registered email address notifying them about the change in the registered email address.",
+       "notificationemail_body_removed": "Body of the email sent on the previously registered email address notifying them about the removal of the registered email address.",
        "scarytranscludedisabled": "Shown when scary transclusion is disabled.",
        "scarytranscludefailed": "Shown when the HTTP request for the template failed. Identical to {{msg-mw|Scarytranscludefailed-httpstatus}}, but does not show the HTTP error which was received. This will not be parsed as wikitext and will appear as is. Parameters:\n* $1 - URL which points to interwiki template",
        "scarytranscludefailed-httpstatus": "Identical to {{msg-mw|Scarytranscludefailed}}, but shows the HTTP error which was received. This will not be parsed as wikitext and will appear as is. Parameters:\n* $1 - URL which points to interwiki template\n* $2 - HTTP status, integer (other than 200)",
index 134328a..66dd008 100644 (file)
        "exif-colorspace": "Llimphi suyu",
        "exif-componentsconfiguration": "Sapa ñawpariqninpa sut'in",
        "exif-compressedbitsperpixel": "Rikchap mat'isqa kaynin laya",
-       "exif-pixelydimension": "Rikchap suni kaynin",
-       "exif-pixelxdimension": "Rikchap hanaq kaynin",
+       "exif-pixelxdimension": "Rikchap suni kaynin",
+       "exif-pixelydimension": "Rikchap hanaq kaynin",
        "exif-usercomment": "Llamk'achiqpa willayninkuna",
        "exif-relatedsoundfile": "Ninachiq ruqyay willañiqi",
        "exif-datetimeoriginal": "Willakunap kamaynin p'unchaw, pacha",
index be52e15..4b379a4 100644 (file)
        "exif-colorspace": "Spazi da colurs",
        "exif-componentsconfiguration": "Significaziun da las singulas cumponentas",
        "exif-compressedbitsperpixel": "Modus da cumprimer",
-       "exif-pixelydimension": "Ladezza dal maletg",
-       "exif-pixelxdimension": "Autezza dal maletg",
+       "exif-pixelxdimension": "Ladezza dal maletg",
+       "exif-pixelydimension": "Autezza dal maletg",
        "exif-usercomment": "Commentari da l'utilisader",
        "exif-relatedsoundfile": "Datoteca d'audio appartegnenta",
        "exif-datetimeoriginal": "Data e temp da la generaziun",
index 19358ce..7390ae8 100644 (file)
        "exif-colorspace": "Spațiu de culoare",
        "exif-componentsconfiguration": "Semnificația fiecărei componente",
        "exif-compressedbitsperpixel": "Mod de comprimare a imaginii",
-       "exif-pixelydimension": "Lățimea imaginii",
-       "exif-pixelxdimension": "Înălțimea imaginii",
+       "exif-pixelxdimension": "Lățimea imaginii",
+       "exif-pixelydimension": "Înălțimea imaginii",
        "exif-usercomment": "Comentariile utilizatorilor",
        "exif-relatedsoundfile": "Fișierul audio asemănător",
        "exif-datetimeoriginal": "Data și ora producerii imaginii",
index 5e2559e..c575d07 100644 (file)
        "exif-colorspace": "Spazie d'u culore",
        "exif-componentsconfiguration": "Significate de ogne combonende",
        "exif-compressedbitsperpixel": "Mode de combressione de l'immaggine",
-       "exif-pixelydimension": "Larghezze de l'immaggine",
-       "exif-pixelxdimension": "Altezze de l'immaggine",
+       "exif-pixelxdimension": "Larghezze de l'immaggine",
+       "exif-pixelydimension": "Altezze de l'immaggine",
        "exif-usercomment": "Commende de l'utende",
        "exif-relatedsoundfile": "File audio collegate",
        "exif-datetimeoriginal": "Date e ore d'a generazione de le date",
index 4e92f87..a689b5e 100644 (file)
        "exif-colorspace": "Цветовое пространство",
        "exif-componentsconfiguration": "Конфигурация цветовых компонентов",
        "exif-compressedbitsperpixel": "Глубина цвета после сжатия",
-       "exif-pixelydimension": "Ширина изображения",
-       "exif-pixelxdimension": "Высота изображения",
+       "exif-pixelxdimension": "Ширина изображения",
+       "exif-pixelydimension": "Высота изображения",
        "exif-usercomment": "Дополнительный комментарий",
        "exif-relatedsoundfile": "Файл звукового комментария",
        "exif-datetimeoriginal": "Оригинальные дата и время",
        "redirect-not-exists": "Значение не найдено",
        "fileduplicatesearch": "Поиск одинаковых файлов",
        "fileduplicatesearch-summary": "Поиск одинаковых файлов по хэш-коду.",
-       "fileduplicatesearch-legend": "Поиск дубликатов",
        "fileduplicatesearch-filename": "Имя файла:",
        "fileduplicatesearch-submit": "Найти",
        "fileduplicatesearch-info": "$1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}<br />Размер файла: $3<br />MIME-тип: $4",
index 1c1c7ce..a0ea840 100644 (file)
        "exif-colorspace": "Фаребный простор",
        "exif-componentsconfiguration": "Конфіґурація компонентів фарбы",
        "exif-compressedbitsperpixel": "Компрімачный режім",
-       "exif-pixelydimension": "Шырка образчіка",
-       "exif-pixelxdimension": "Вышка образчіка",
+       "exif-pixelxdimension": "Шырка образчіка",
+       "exif-pixelydimension": "Вышка образчіка",
        "exif-usercomment": "Додатковый коментарь",
        "exif-relatedsoundfile": "Звязаный звуковый файл",
        "exif-datetimeoriginal": "Оріґіналный датум і час",
index 9eae5d1..da4e81f 100644 (file)
        "exif-colorspace": "वर्णावकाशः",
        "exif-componentsconfiguration": "प्रत्येकं भागस्य अर्थः ।",
        "exif-compressedbitsperpixel": "चित्रसङ्कोचविधानम् ।",
-       "exif-pixelydimension": "चित्रपार्थवम् (width)",
-       "exif-pixelxdimension": "चित्रैन्नत्यम् ।",
+       "exif-pixelxdimension": "चित्रपार्थवम् (width)",
+       "exif-pixelydimension": "चित्रैन्नत्यम् ।",
        "exif-usercomment": "योजकाभिप्रायः ।",
        "exif-relatedsoundfile": "सम्बद्धश्रवणसञ्चिका ।",
        "exif-datetimeoriginal": "दत्तांशसर्जनस्य दिनाङ्कः समयः च ।",
index 0e2e3f2..9fd097f 100644 (file)
        "exif-colorspace": "Өҥ куйаара (пространство, space)",
        "exif-componentsconfiguration": "Хас биирдии компонент суолтата",
        "exif-compressedbitsperpixel": "Ойууну хам тутуу ньымата",
-       "exif-pixelydimension": "Ойуу кэтитэ",
-       "exif-pixelxdimension": "Ойуу үрдүгэ",
+       "exif-pixelxdimension": "Ойуу кэтитэ",
+       "exif-pixelydimension": "Ойуу үрдүгэ",
        "exif-usercomment": "Кыттааччы хос быһаарыыта",
        "exif-relatedsoundfile": "Аудио-билэҕэ сыһыаннаах",
        "exif-datetimeoriginal": "Оҥоһуллубут кэмэ",
index e7363e1..fae4d99 100644 (file)
        "exif-colorspace": "Spazziu dî culuri",
        "exif-componentsconfiguration": "Significatu d'ognuna cumpunenti",
        "exif-compressedbitsperpixel": "Mudalitati di cumprissioni dâ mmàggini",
-       "exif-pixelydimension": "Larghizza dâ mmàggini",
-       "exif-pixelxdimension": "Autizza dâ mmàggini",
+       "exif-pixelxdimension": "Larghizza dâ mmàggini",
+       "exif-pixelydimension": "Autizza dâ mmàggini",
        "exif-usercomment": "Noti di l'utenti",
        "exif-relatedsoundfile": "File audiu culligatu",
        "exif-datetimeoriginal": "Data e ura di criazzioni dî dati",
index bcba1a5..b22fa63 100644 (file)
        "exif-colorspace": "Colour space",
        "exif-componentsconfiguration": "Meanin o ilka component",
        "exif-compressedbitsperpixel": "Eemage compression mode",
-       "exif-pixelydimension": "Eemage width",
-       "exif-pixelxdimension": "Eemage heicht",
+       "exif-pixelxdimension": "Eemage width",
+       "exif-pixelydimension": "Eemage heicht",
        "exif-usercomment": "Uiser comments",
        "exif-relatedsoundfile": "Relatit audío file",
        "exif-datetimeoriginal": "Date n time o data generation",
index c6e6e6d..23ddbe9 100644 (file)
@@ -47,6 +47,7 @@
        "underline-always": "هميشہ",
        "underline-never": "ڪڏهن بہ نہ",
        "editfont-style": "ايراضي جو فونٽ اسٽائيل سنواريو:",
+       "editfont-serif": "سيرِف اِنڊو",
        "sunday": "آچر",
        "monday": "سومر",
        "tuesday": "اڱارو",
        "resetpass_submit": "ڳجھو لفظ طَي ڪريو ۽ لاگ اِن ٿيو",
        "changepassword-success": "توهان جو ڳجھو لفظ ڪاميابيءَ سان بدلايو ويو!",
        "changepassword-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "botpasswords-label-create": "سرجيو",
+       "botpasswords-label-update": "تجديد",
+       "botpasswords-label-cancel": "رد",
+       "botpasswords-label-delete": "ڊاهيو",
+       "botpasswords-label-resetpassword": "ڳجھو لفظ  نئين سِر مقرر ڪريو",
        "resetpass_forbidden": "ڳجھو لفظ بدلائي نہ ٿو سگھجي.",
        "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ لاگ اِن ٿيڻ ضروري آهي.",
        "resetpass-submit-loggedin": "ڳجھو لفظ بدلايو",
        "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-domain": "ميدان:",
+       "passwordreset-capture": "برق ٽپال ڏسڻ چاهيندا؟",
        "passwordreset-email": "برق ٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
        "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
        "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
        "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
        "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
+       "sectioneditnotsupported-title": "سيڪشن جي سنوار ممڪن نہ آهي",
+       "sectioneditnotsupported-text": "هن صفحي تي سيڪشن کي سنوارڻ ممڪن نہ آهي.",
        "permissionserrors": "اجازتنامي جي چُڪَ",
        "permissionserrorstext": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي اهو ڪرڻ جي اجازت حاصل ڪانهي.",
        "permissionserrorstext-withaction": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي $2 جي اجازت ڪانهي.",
        "timezonelegend": "اوقاتي زون:",
        "localtime": "مقامي وقت:",
        "timezoneuseserverdefault": "وڪي عدم پيروي استعمال ڪريو ($1)",
+       "timezoneuseoffset": "ٻيو (ڄاڻايو)",
        "servertime": "سَروَر پٽاندر وقت:",
        "guesstimezone": "جھانگُوءَ مان ڀريو",
        "timezoneregion-africa": "آفريڪا",
        "right-move-categorypages": "زمراتي صفحا چوريو",
        "right-movefile": "فائيل چوريو",
        "right-upload": "فائيل چاڙهيو",
+       "right-reupload": "موجوده فائيلن مٿان",
        "right-upload_by_url": "ڪنهن يُوآرايل تان فائيل چاڙهيو",
        "right-writeapi": "اي پر آءِ لکڻ جو استعمال",
        "right-delete": "صفحا ڊاهيو",
        "right-viewmywatchlist": "پنهنجي ٽيٽ لسٽ ڏسو",
        "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
        "right-import": "ٻين وڪيز کان صفحا درآمديو",
+       "right-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
        "right-mergehistory": "صفحن جي سوانح سنواريو",
        "right-userrights": "سڀ يوزر حق ترميم ڪريو",
        "right-userrights-interwiki": "هن وڪي جي يوزرس جا حق ترميم ڪريو",
        "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
        "right-passwordreset": "ڳجھو لفظ مقرري برق ٽپالون ڏسو",
        "right-managechangetags": "اعدادخاني ۾ [[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.",
+       "grant-group-email": "برق ٽپال اماڻيو",
+       "grant-blockusers": "يُوزرس کي بندشيو ۽ اڻبندشيو",
+       "grant-createaccount": "نئون کاتو کوليو",
+       "grant-editmywatchlist": "پنهنجي ٽيٽ فهرست سنواريو",
+       "grant-editprotected": "تحفظيل صفحا سنواريو",
+       "grant-rollback": "صفحن ۾ ڪيل تبديليون واپس ورايو",
+       "grant-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
+       "grant-uploadeditmovefile": "فائيل چاڙهيو، مَٽايو، ۽ ڊاهيو",
+       "grant-uploadfile": "نئون فائيل چاڙهيو",
+       "grant-basic": "بنيادي حقَ",
+       "grant-viewdeleted": "ڊَٺَلَ فائيلَ ۽ صفحا ڏسو",
+       "grant-viewmywatchlist": "پنهنجي ٽيٽ فهرست ڏسو",
        "newuserlogpage": "يوزر کاتن جو لاگ",
        "rightslog": "يُوزر حق لاگ",
        "action-read": "هي صفحو پڙهو",
        "newpageletter": "ن",
        "boteditletter": "گ",
        "number_of_watching_users_pageview": "[$1، {{PLURAL:$1|يُوزر|يُوزرس}} کي ٽيٽيندي]",
+       "rc_categories_any": "چونڊيلن مان ڪو بہ",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
+       "newsectionsummary": "/* $1 */ نئون سيڪشن",
        "rc-enhanced-expand": "تفصيل ڏيکاريو",
        "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked": "لاڳاپيل تبديليون",
        "fileuploadsummary": "خلاصو:",
        "filereuploadsummary": "فائيل تبديليون:",
        "filesource": "ذريعو:",
+       "ignorewarnings": "وارنڱس کي نظرانداز ڪريو",
+       "badfilename": "فائيل‌نانءُ بدلائي \"$1\" رکيو ويو آهي.",
+       "empty-file": "توهان جو جمع ڪرايل فائيل خالي آهي.",
        "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
        "filetype-banned": "فائيل جو هيءُ قسم بندشيل آهي.",
        "verification-error": "هن فائيل جي تصديق ٿي نہ سگھي.",
        "upload-options": "چاڙھ جا چارا",
        "watchthisupload": "هيءُ فائيل ٽيٽيو",
        "upload-file-error": "اندروني چُڪَ",
+       "upload-http-error": "ايڇ ٽي ٽي پي جي چُڪَ ٿي آهي: $1",
        "upload-dialog-title": "فائيل چاڙهيو",
        "upload-dialog-button-cancel": "رد",
        "upload-dialog-button-done": "ٿي ويو",
        "backend-fail-move": "فائيل \"$1\" کي \"$2\" ڏانهن چوري نه سگھيو.",
        "backend-fail-opentemp": "عارضي فائيئ کولي نه سگھيو.",
        "backend-fail-read": "فائيل \"$1\" کي پڙهي نه سگھيو.",
+       "uploadstash-thumbnail": "ٽِڪِلي ڏسو",
+       "img-auth-accessdenied": "دسترس کان جواب",
        "license-header": "لائيسنسڪاري",
+       "nolicense": "چونڊ اڻموجود",
        "listfiles-delete": "ڊاهيو",
        "imgfile": "فائيل",
        "listfiles": "فائيل فهرست",
+       "listfiles_thumb": "ٽِڪِلِي",
        "listfiles_date": "تاريخ",
        "listfiles_name": "نالو",
        "listfiles_user": "يُوزر",
        "filehist-datetime": "تاريخ/وقت",
        "filehist-thumb": "آڱوٺي ننهن",
        "filehist-thumbtext": "$1 جي نظرثاني لاءِ تصويري نشان",
+       "filehist-nothumb": "ٽِڪِلِي اڻموجود",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
        "unusedtemplates": "اڻ استعماليل سانچا",
        "unusedtemplateswlh": "ٻيا ڳنڍڻا",
        "randompage": "بلاترتيب صفحو",
+       "randomincategory": "زمري مان ڪو بلاترتيب صفحو",
        "randomincategory-category": "زمرو:",
+       "randomincategory-legend": "زمري مان ڪو بلاترتيب صفحو",
        "randomincategory-submit": "هلو",
        "randomredirect": "بلا ترتيب چورڻو",
        "statistics": "انگ اکر",
        "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
        "statistics-users-active": "سرگرم يُوزرس",
        "statistics-users-active-desc": "اهي يُوزرس جن پوين {{PLURAL:$1|ڏينهن|$1 ڏينهن}} ۾ ڪا سرگرمي ڏيکاري آهي.",
+       "pageswithprop-prop": "خصوصيت نانءُ:",
        "pageswithprop-submit": "ھلو",
        "doubleredirects": "ٻٽا چورڻا",
        "double-redirect-fixed-move": "[[$1]] چورجي چڪو آهي. ان کي خودڪاراً تجديديو ويو ۽ هاڻي اهو [[$2]] ڏانهن وٺي وڃي ٿو.",
        "deadendpages": "اڻ ڳنڍيندڙ صفحا",
        "protectedpages": "تحفظيل صفحا",
        "protectedpages-noredirect": "چورڻا لڪايو",
+       "protectedpages-timestamp": "اوقاتي مُهُرَ",
        "protectedpages-page": "صفحو",
+       "protectedpages-params": "تحفظ جا نميپيما",
        "protectedpages-reason": "سبب",
        "protectedpages-submit": "صفحا ڏيکاريو",
        "protectedpages-unknown-timestamp": "اڻڄاتل",
        "protectedtitles-submit": "عنوان ڏيکاريو",
        "listusers": "يُوزر فهرست",
        "newpages": "نوان صفحا",
+       "newpages-submit": "ڏيکاريو",
        "newpages-username": "يُوزرنانءُ:",
        "ancientpages": "قديم ترين صفحا",
        "move": "چوريو",
        "movethispage": "هيءُ صفحو چوريو",
        "notargettitle": "بنان هدف",
+       "nopagetitle": "اهدافي صفحو اڻموجود",
        "pager-older-n": "{{PLURAL:$1|پراڻو 1|پراڻا $1}}",
+       "apisandbox-retry": "ٻيهر ڪوشش ڪريو",
+       "apisandbox-helpurls": "امدادي ڳنڍڻا",
+       "apisandbox-examples": "مثال",
+       "apisandbox-dynamic-parameters-add-label": "نيمپيما شامل ڪريو",
+       "apisandbox-dynamic-parameters-add-placeholder": "نيمپيما نانءُ",
+       "apisandbox-results": "نتيجا",
        "booksources": "ڪتابي وسيلا",
        "booksources-search-legend": "ڪتابي ذريعن جي ڳولا ڪريو",
        "booksources-search": "ڳوليو",
        "specialloguserlabel": "پيش ڪندڙ:",
        "speciallogtitlelabel": "نشانو (عنوان يا {{ns:user}}:يا يوزنانءُ يور جي لاءِ):",
        "log": "لاگس",
+       "logeventslist-submit": "ڏيکاريو",
        "all-logs-page": "سڀ عوامي لاگس",
+       "checkbox-none": "ڪو بہ نہ",
+       "checkbox-invert": "ابتيو",
        "allpages": "سڀ صفحا",
        "nextpage": "اڳيون صفحو ($1)",
        "prevpage": "پويون صفحو ($1)",
        "allpagesfrom": "ھتان شروع ٿيندڙ صفحا نمايو",
+       "allpagesto": "ان تي ختم ٿيندڙ صفحا نُمايو:",
        "allarticles": "سمورا مضمون",
        "allinnamespace": "سمورا صفحا ($1 نانءُپولار)",
        "allpagessubmit": "ھلو",
        "allpagesprefix": "صفحا نمايو بمع اڳياڙي:",
+       "allpagesbadtitle": "صفحي جو گھربل عنوان ڪار ڪونهي، يا خالي آهي، يا وري غيردرست طريقي سان ڳنڍيل بين‌الزباني يا بين‌الوڪي عنوان آهي. \nان ۾ هڪ يا هڪ کان وڌيڪ اهڙا اکر موجود ٿي سگھن ٿا، جيڪي عنوان ۾ استعمال ڪري نہ ٿا سگھجن.",
        "categories": "زمرا",
+       "categories-submit": "ڏيکاريو",
        "deletedcontributions": "يُوزر جون ڊاٺل ڀاڱيداريون",
        "deletedcontributions-title": "يُوزر جون ڊاٺل ڀاڱيداريون",
        "sp-deletedcontributions-contribs": "ڀاڱيداريون",
        "listgrouprights-addgroup-all": "سڀ گروپَ شامل ڪريو",
        "listgrouprights-removegroup-all": "سڀ گروپ هٽايو",
        "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
+       "listgrants-rights": "حق",
        "trackingcategories-name": "پيغام جو نالو",
        "trackingcategories-nodesc": "ڪا به تشريح موجود نه آهي.",
        "trackingcategories-disabled": "زمرو ناقابلِ ڪار بڻايل آهي.",
        "mywatchlist": "ٽيٽ فهرست",
        "addwatch": "ٽيٽ فهرست ۾ شامل ڪريو",
        "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ڪيو ويو آهي.",
+       "removewatch": "ٽيٽ فهرست مان خارج ڪريو",
        "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|ٽيٽ فهرست]] مان هٽي چڪو آهي.",
        "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.\"",
        "watch": "ٽيٽيو",
        "exif-artist": "ليکڪ",
        "exif-copyright": "حق ۽ واسطا رکندڙ",
        "exif-colorspace": "رنگ پولار",
-       "exif-pixelydimension": "عڪس جي ويڪر",
-       "exif-pixelxdimension": "عڪس جي اوچائي",
+       "exif-pixelxdimension": "عڪس جي ويڪر",
+       "exif-pixelydimension": "عڪس جي اوچائي",
        "exif-usercomment": "يُوزر جا تاثرات",
        "exif-relatedsoundfile": "لاڳاپيل آوازي فائيل",
        "exif-datetimeoriginal": "اعداد جي جڙڻ جي تاريخ ۽ وقت",
index 015e408..cf0dcd3 100644 (file)
        "metadata-help": "ئەی پەڕگە زانیاری فرەێگ لەتێیە، ک گەھا دۊردۊن (camera) یا ئسکەنێر (scanner) خستۊە سەری. ئەگەر پەڕگەگە لە حاڵەتە سەرەتاییەگەیەو دەسکاری کریاۊد، گاھەس بڕێگ لە وردەکاریەیل، زانیارەگان وێنە گووڕیاێەگە وە تەواوی نیشان نەدەن.",
        "metadata-fields": "کاڵگەگان (fields) میتادەیتاێ وێنە ک لە ئەی پەیامە وەڕزارەو کریانە، کاتێگ جەدوەل میتادەیتا کووکریاێ بوود لە پەڕەی وێنە نیشان دەریەن.\nکاڵگەگان تر لە حاڵەتی بنەڕەتی شاریاێن.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagedescription": "ناونیشان وێنە",
-       "exif-pixelxdimension": "بەرزی وێنە",
+       "exif-pixelydimension": "بەرزی وێنە",
        "exif-flash": "فلەش",
        "exif-keywords": "کلیل‌وشەیل",
        "exif-writer": "نۊسەر",
index 2c92aab..5b6fe26 100644 (file)
        "exif-colorspace": "Noone farru",
        "exif-componentsconfiguration": "Jere-ize foo kul maana",
        "exif-compressedbitsperpixel": "Bii kankamandiyan yaayi",
-       "exif-pixelydimension": "Bii hayri",
-       "exif-pixelxdimension": "Bii kayyan",
+       "exif-pixelxdimension": "Bii hayri",
+       "exif-pixelydimension": "Bii kayyan",
        "exif-usercomment": "Goykaw daarawey",
        "exif-relatedsoundfile": "Jinde tuku hangante",
        "exif-datetimeoriginal": "Han nda waati bayhaya teeyan se",
index ec538b1..9ecd27b 100644 (file)
        "exif-exifversion": "Exif atmains",
        "exif-colorspace": "Spalvū lauks",
        "exif-compressedbitsperpixel": "Abruozdielė sospaudėma rėžėms",
-       "exif-pixelydimension": "Abruozdielė platoms",
-       "exif-pixelxdimension": "Abruozdielė augoms",
+       "exif-pixelxdimension": "Abruozdielė platoms",
+       "exif-pixelydimension": "Abruozdielė augoms",
        "exif-usercomment": "Pāiškėnėmā",
        "exif-relatedsoundfile": "Prėgolons garsos",
        "exif-datetimeoriginal": "Žėnės paderbėma čiesos",
index 17ef183..b2c99a6 100644 (file)
        "exif-colorspace": "Prostor boje",
        "exif-componentsconfiguration": "Značenje pojedine komponente",
        "exif-compressedbitsperpixel": "Dubina boje poslije sažimanja",
-       "exif-pixelydimension": "Širina slike",
-       "exif-pixelxdimension": "Visina slike",
+       "exif-pixelxdimension": "Širina slike",
+       "exif-pixelydimension": "Visina slike",
        "exif-usercomment": "Korisnički komentari",
        "exif-relatedsoundfile": "Povezana zvučna datoteka",
        "exif-datetimeoriginal": "Datum i vrijeme generisanja podataka",
index 0874070..f5c2b71 100644 (file)
        "exif-colorspace": "වර්ණ අවකාශය",
        "exif-componentsconfiguration": "එක් එක් සංරචකයේ අර්ථය",
        "exif-compressedbitsperpixel": "රූප සම්පීඩන මාදිලිය",
-       "exif-pixelydimension": "ප්‍රතිබිම්බයෙහි පළල",
-       "exif-pixelxdimension": "ප්‍රතිබිම්බයෙහි උස",
+       "exif-pixelxdimension": "ප්‍රතිබිම්බයෙහි පළල",
+       "exif-pixelydimension": "ප්‍රතිබිම්බයෙහි උස",
        "exif-usercomment": "පරිශීලක පරිකථනයන්",
        "exif-relatedsoundfile": "සහසම්බන්ධිත ශ්‍රව්‍ය ගොනුව",
        "exif-datetimeoriginal": "දත්ත ජනන දිනය හා වේලාව",
index 01ff533..02494f2 100644 (file)
        "exif-colorspace": "Farebný priestor",
        "exif-componentsconfiguration": "Význam jednotlivých zložiek",
        "exif-compressedbitsperpixel": "Komprimované bity na pixel",
-       "exif-pixelydimension": "Šírka obrázka",
-       "exif-pixelxdimension": "Výška obrázka",
+       "exif-pixelxdimension": "Šírka obrázka",
+       "exif-pixelydimension": "Výška obrázka",
        "exif-usercomment": "Komentár používateľa",
        "exif-relatedsoundfile": "Súvisiaci zvukový súbor",
        "exif-datetimeoriginal": "Dátum a čas vytvorenia dát",
index b5febf8..83b8566 100644 (file)
        "exif-colorspace": "Barvni prostor",
        "exif-componentsconfiguration": "Pomen posameznih gradnikov",
        "exif-compressedbitsperpixel": "Velikost točke po stiskanju (v bitih)",
-       "exif-pixelydimension": "Širina slike",
-       "exif-pixelxdimension": "Višina slike",
+       "exif-pixelxdimension": "Širina slike",
+       "exif-pixelydimension": "Višina slike",
        "exif-usercomment": "Uporabniške pripombe",
        "exif-relatedsoundfile": "Pripadajoča zvočna datoteka",
        "exif-datetimeoriginal": "Datum in čas ustvaritve podatkov",
        "redirect-not-exists": "Vrednosti ni mogoče najti",
        "fileduplicatesearch": "Iskanje podvojenih datotek",
        "fileduplicatesearch-summary": "Iskanje podvojenih datotek, ki temelji na podlagi njenih hashvrednosti.",
-       "fileduplicatesearch-legend": "Poišči dvojnik",
        "fileduplicatesearch-filename": "Ime datoteke:",
        "fileduplicatesearch-submit": "Iskanje",
        "fileduplicatesearch-info": "$1 × $2 pik<br />Velikost datoteke: $3<br />Vrsta MIME: $4",
index 05dd455..59cb1fb 100644 (file)
        "exif-artist": "Fotogroaf",
        "exif-flashpixversion": "understitzte Flashpix-Version",
        "exif-colorspace": "Forbraum",
-       "exif-pixelydimension": "Giltige Bildbreite",
-       "exif-pixelxdimension": "Giltige Bildhiehe",
+       "exif-pixelxdimension": "Giltige Bildbreite",
+       "exif-pixelydimension": "Giltige Bildhiehe",
        "exif-usercomment": "Nutzerkommentare",
        "exif-relatedsoundfile": "Zugehierige Tondatei",
        "exif-exposuretime-format": "$1 Sekunda ($2)",
index 552431f..16042c6 100644 (file)
        "exif-colorspace": "Hapësira e ngjyrave",
        "exif-componentsconfiguration": "Kuptimi i secilit komponent",
        "exif-compressedbitsperpixel": "Lloji i ngjeshjes së figurës",
-       "exif-pixelydimension": "Gjerësia Image",
-       "exif-pixelxdimension": "lartësi Image",
+       "exif-pixelxdimension": "Gjerësia Image",
+       "exif-pixelydimension": "lartësi Image",
        "exif-usercomment": "Komentet e përdoruesit",
        "exif-relatedsoundfile": "Skeda audio shoqëruese",
        "exif-datetimeoriginal": "Data dhe koha e prodhimit të të dhënave",
index d49fa65..06b1dc2 100644 (file)
        "exif-colorspace": "Простор боје",
        "exif-componentsconfiguration": "Значење сваког дела",
        "exif-compressedbitsperpixel": "Режим сажимања слике",
-       "exif-pixelydimension": "Ширина слике",
-       "exif-pixelxdimension": "Висина слике",
+       "exif-pixelxdimension": "Ширина слике",
+       "exif-pixelydimension": "Висина слике",
        "exif-usercomment": "Кориснички коментари",
        "exif-relatedsoundfile": "Повезани звучни запис",
        "exif-datetimeoriginal": "Датум и време сликања",
        "redirect-not-exists": "Вредност није пронађена",
        "fileduplicatesearch": "Претрага дупликата",
        "fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.",
-       "fileduplicatesearch-legend": "Претрага дупликата",
        "fileduplicatesearch-filename": "Назив датотеке:",
        "fileduplicatesearch-submit": "Претражи",
        "fileduplicatesearch-info": "$1 × $2 пиксела<br />Величина датотеке: $3<br />MIME тип: $4",
index 7ac1b05..6dd8700 100644 (file)
        "exif-colorspace": "Prostor boje",
        "exif-componentsconfiguration": "Značenje svakog dela",
        "exif-compressedbitsperpixel": "Režim sažimanja slike",
-       "exif-pixelydimension": "Širina slike",
-       "exif-pixelxdimension": "Visina slike",
+       "exif-pixelxdimension": "Širina slike",
+       "exif-pixelydimension": "Visina slike",
        "exif-usercomment": "Korisnički komentari",
        "exif-relatedsoundfile": "Povezani zvučni zapis",
        "exif-datetimeoriginal": "Datum i vreme slikanja",
        "redirect-not-exists": "Vrednost nije pronađen",
        "fileduplicatesearch": "Pretraga duplikata",
        "fileduplicatesearch-summary": "Pretraga dupliranih datoteka prema heš vrednosti.",
-       "fileduplicatesearch-legend": "Pretraga duplikata",
        "fileduplicatesearch-filename": "Naziv datoteke:",
        "fileduplicatesearch-submit": "Pretraži",
        "fileduplicatesearch-info": "$1 × $2 piksela<br />Veličina datoteke: $3<br />MIME tip: $4",
index 9f38a0a..50c3bf9 100644 (file)
        "exif-colorspace": "Faawenruum",
        "exif-componentsconfiguration": "Betjuudenge fon älke Komponente",
        "exif-compressedbitsperpixel": "Komprimierde Bits pro Pixel",
-       "exif-pixelydimension": "Bieldebratte",
-       "exif-pixelxdimension": "Bieldehöchte",
+       "exif-pixelxdimension": "Bieldebratte",
+       "exif-pixelydimension": "Bieldehöchte",
        "exif-usercomment": "Benutserkommentoare",
        "exif-relatedsoundfile": "Touheerige Toondoatäi",
        "exif-datetimeoriginal": "Ärfoatengstiedpunkt",
index 520f3b3..d5e4dee 100644 (file)
        "exif-colorspace": "Rohangan warna",
        "exif-componentsconfiguration": "Harti unggak komponén",
        "exif-compressedbitsperpixel": "Mode komprési gambar",
-       "exif-pixelydimension": "Lébar gambar",
-       "exif-pixelxdimension": "Jangkung gambar",
+       "exif-pixelxdimension": "Lébar gambar",
+       "exif-pixelydimension": "Jangkung gambar",
        "exif-usercomment": "Koméntar pamaké",
        "exif-datetimeoriginal": "Titimangsa jeung wanci dijieunna data",
        "exif-datetimedigitized": "Titimangsa jeung wanci digitisasi",
index 2c8ed35..f7119bf 100644 (file)
        "noemail": "Användaren \"$1\" har inte registrerat någon e-postadress.",
        "noemailcreate": "Du måste ange en giltig e-postadress",
        "passwordsent": "Ett nytt lösenord har skickats till den e-postadress som användaren \"$1\" har registrerat. När du får meddelandet, var god logga in igen.",
-       "blocked-mailpassword": "Din IP-adress är blockerad, därför kan den inte användas för att få ett nytt lösenord.",
+       "blocked-mailpassword": "Din IP-adress har blockerats från att redigera. För att förhindra missbruk kan den inte användas för att få ett nytt lösenord.",
        "eauthentsent": "Ett e-postmeddelande för bekräftelse har skickats till den angivna e-postadressen.\nInnan någon annan e-post kan skickas till kontot, måste du följa instruktionerna i e-postmeddelandet för att bekräfta att kontot verkligen är ditt.",
        "throttled-mailpassword": "En lösenordsåterställning har redan skickats för mindre än {{PLURAL:$1|en timme|$1 timmar}} sedan.\nFör att förhindra missbruk skickas bara en lösenordsåterställning per {{PLURAL:$1|timme|$1-timmarsperiod}}.",
        "mailerror": "Fel vid skickande av e-post: $1",
        "ipb-unblock": "Ta bort blockering av en användare eller IP-adress",
        "ipb-blocklist": "Visa gällande blockeringar",
        "ipb-blocklist-contribs": "Bidrag från {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 kvar",
        "unblockip": "Ta bort blockering av användare/IP-adress",
        "unblockiptext": "Använd formuläret nedan för att ta bort blockeringen av en IP-adress.",
        "ipusubmit": "Upphäv denna blockering",
        "exif-colorspace": "Färgrymd",
        "exif-componentsconfiguration": "Komponentanalys",
        "exif-compressedbitsperpixel": "Bildkomprimeringsläge",
-       "exif-pixelydimension": "Bildbredd",
-       "exif-pixelxdimension": "Bildhöjd",
+       "exif-pixelxdimension": "Bildbredd",
+       "exif-pixelydimension": "Bildhöjd",
        "exif-usercomment": "Kommentarer",
        "exif-relatedsoundfile": "Relaterad ljudfil",
        "exif-datetimeoriginal": "Exponeringstidpunkt",
        "redirect-not-exists": "Värdet hittades inte",
        "fileduplicatesearch": "Sök efter dubblettfiler",
        "fileduplicatesearch-summary": "Sök efter dubblettfiler baserat på filernas hash-värden.",
-       "fileduplicatesearch-legend": "Sök efter en dubblettfil",
        "fileduplicatesearch-filename": "Filnamn:",
        "fileduplicatesearch-submit": "Sök",
        "fileduplicatesearch-info": "$1 × $2 pixlar<br />Filstorlek: $3<br />MIME-typ: $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|skyddade}} $3 $4 [kaskaderande]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4 [kaskaderande]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3 från $4 till $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för {{GENDER:$3|$3}} från $4 till $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "api-error-unknownerror": "Okänt fel: \"$1\".",
        "api-error-uploaddisabled": "Uppladdning är inaktiverad på denna wiki.",
        "api-error-verification-error": "Denna fil kan vara skadad eller har fel filändelse.",
+       "api-error-was-deleted": "En fil med detta namn har tidigare laddats upp och sedan raderats.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunder}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuter}}",
        "duration-hours": "$1 {{PLURAL:$1|timme|timmar}}",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Symboler",
        "special-characters-group-greek": "Grekiska",
+       "special-characters-group-greekextended": "Grekiska utvidgad",
        "special-characters-group-cyrillic": "Kyrilliskt",
        "special-characters-group-arabic": "Arabiska",
        "special-characters-group-arabicextended": "Arabiska utökade",
index 532f1ab..33d97e7 100644 (file)
        "exif-copyright": "Mwenye hatimiliki",
        "exif-exifversion": "Mtindo wa Exif",
        "exif-componentsconfiguration": "Maana ya kila kijenzi",
-       "exif-pixelydimension": "Upana wa picha",
-       "exif-pixelxdimension": "Urefu wa picha",
+       "exif-pixelxdimension": "Upana wa picha",
+       "exif-pixelydimension": "Urefu wa picha",
        "exif-usercomment": "Maoni ya mtumiaji",
        "exif-relatedsoundfile": "Faili la sauti linalohusika",
        "exif-lightsource": "Mwanga",
index ee91968..2d3e184 100644 (file)
        "exif-colorspace": "Přestřyń kolorůw",
        "exif-componentsconfiguration": "Značyńy skuadowych",
        "exif-compressedbitsperpixel": "Skůmpresowanych bitůw na piksel",
-       "exif-pixelydimension": "Prawidłowa szyrzka uobrozu",
-       "exif-pixelxdimension": "Prawidłowo wyżka uobrozu",
+       "exif-pixelxdimension": "Prawidłowa szyrzka uobrozu",
+       "exif-pixelydimension": "Prawidłowo wyżka uobrozu",
        "exif-usercomment": "Kůmyntoř užytkowńika",
        "exif-relatedsoundfile": "Powjůnzany plik audjo",
        "exif-datetimeoriginal": "Data i čas utwořyńo uoryginouu",
index dfa514b..c75952a 100644 (file)
        "exif-colorspace": "நிற வெளி",
        "exif-componentsconfiguration": "ஒவ்வெரு அங்கத்தினதும் பொருள்",
        "exif-compressedbitsperpixel": "படிம சுறுக்க முறை",
-       "exif-pixelydimension": "பட அகலம்",
-       "exif-pixelxdimension": "பட உயரம்",
+       "exif-pixelxdimension": "பட அகலம்",
+       "exif-pixelydimension": "பட உயரம்",
        "exif-usercomment": "பயனர் கருத்துக்கள்",
        "exif-relatedsoundfile": "தொடர்புள்ள ஒலிக்கோப்பு",
        "exif-datetimeoriginal": "தரவு உருவாக்க நாள் நேரம்",
        "redirect-not-exists": "மதிப்பு காணப்பெறவில்லை",
        "fileduplicatesearch": "நகல் கோப்புகளைத் தேடுக",
        "fileduplicatesearch-summary": "நகல் கோப்புகளை  ஹாஷ் மதிப்புகள் அடிப்படையில் தேடு.",
-       "fileduplicatesearch-legend": "நகல்களைத் தேடுக",
        "fileduplicatesearch-filename": "கோப்பின் பெயர்:",
        "fileduplicatesearch-submit": "தேடுக",
        "fileduplicatesearch-info": "$1 × $2 பிக்சல்<br />கோப்பின் அளவு: $3<br />MIME வகை: $4",
index 8f4ce43..220a009 100644 (file)
        "exif-colorspace": "వర్ణస్థలం",
        "exif-componentsconfiguration": "ప్రతీ అంగం యొక్క అర్థం",
        "exif-compressedbitsperpixel": "బొమ్మ కుదింపు పద్ధతి",
-       "exif-pixelydimension": "బొమ్మ వెడల్పు",
-       "exif-pixelxdimension": "బొమ్మ ఎత్తు",
+       "exif-pixelxdimension": "బొమ్మ వెడల్పు",
+       "exif-pixelydimension": "బొమ్మ ఎత్తు",
        "exif-usercomment": "వాడుకరి వ్యాఖ్యలు",
        "exif-relatedsoundfile": "సంబంధిత శబ్ద ఫైలు",
        "exif-datetimeoriginal": "డేటా తయారైన తేదీ, సమయం",
index 7a0fc81..a885bdc 100644 (file)
        "exif-colorspace": "Фазои ранг",
        "exif-componentsconfiguration": "Маънии ҳар як аз қисмҳо",
        "exif-compressedbitsperpixel": "Ҳолати фишурдасозии акс",
-       "exif-pixelydimension": "Арзи акс",
-       "exif-pixelxdimension": "Тӯли акс",
+       "exif-pixelxdimension": "Арзи акс",
+       "exif-pixelydimension": "Тӯли акс",
        "exif-usercomment": "Тавзеҳоти корбар",
        "exif-relatedsoundfile": "Парвандаи сабти алоқаманд",
        "exif-datetimeoriginal": "Таърих ва вақти тавлиди додаҳо",
index f6e9a95..30f212b 100644 (file)
        "exif-colorspace": "Fazoi rang",
        "exif-componentsconfiguration": "Ma'niji har jak az qismho",
        "exif-compressedbitsperpixel": "Holati fişurdasoziji aks",
-       "exif-pixelydimension": "Arzi aksi mū'tabar",
-       "exif-pixelxdimension": "Tūli aksi mū'tabar",
+       "exif-pixelxdimension": "Arzi aksi mū'tabar",
+       "exif-pixelydimension": "Tūli aksi mū'tabar",
        "exif-usercomment": "Tavzehoti korbar",
        "exif-relatedsoundfile": "Parvandai sabti aloqamand",
        "exif-datetimeoriginal": "Ta'rix va vaqti tavlidi dodaho",
index 453be28..23fa56b 100644 (file)
        "exif-colorspace": "สเปซสี",
        "exif-componentsconfiguration": "ความหมายของแต่ละคอมโพเนนต์",
        "exif-compressedbitsperpixel": "โหมดการบีบอัดภาพ",
-       "exif-pixelydimension": "ความกว้างของภาพ",
-       "exif-pixelxdimension": "ความสูงของภาพ",
+       "exif-pixelxdimension": "ความกว้างของภาพ",
+       "exif-pixelydimension": "ความสูงของภาพ",
        "exif-usercomment": "ความเห็นผู้ใช้",
        "exif-relatedsoundfile": "ไฟล์เสียงที่เกี่ยวข้อง",
        "exif-datetimeoriginal": "วันที่และเวลาการก่อกำเนิดข้อมูล",
index 7e08873..21dafb8 100644 (file)
        "exif-colorspace": "Reňk giňişligi",
        "exif-componentsconfiguration": "Her komponentiň manysy",
        "exif-compressedbitsperpixel": "Surat gysyş režimi",
-       "exif-pixelydimension": "Dogry surat ini",
-       "exif-pixelxdimension": "Dogry surat beýikligi",
+       "exif-pixelxdimension": "Dogry surat ini",
+       "exif-pixelydimension": "Dogry surat beýikligi",
        "exif-usercomment": "Ulanyjy teswirleri",
        "exif-relatedsoundfile": "Degişli audio faýl",
        "exif-datetimeoriginal": "Asyl sene we wagt",
index 5a6ea0f..6e622a8 100644 (file)
        "exif-colorspace": "Espasyo ng kulay",
        "exif-componentsconfiguration": "Kahulugan ng bawat komponente",
        "exif-compressedbitsperpixel": "Modalidad (paraan) ng pagsisiksik ng larawan",
-       "exif-pixelydimension": "Lapad ng larawan",
-       "exif-pixelxdimension": "Taas ng larawan",
+       "exif-pixelxdimension": "Lapad ng larawan",
+       "exif-pixelydimension": "Taas ng larawan",
        "exif-usercomment": "Mga kumento ng tagagamit",
        "exif-relatedsoundfile": "Kaugnay na talaksang nadidinig (audio)",
        "exif-datetimeoriginal": "Petsa at oras ng paglikha ng mga dato",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Landas ng panitik]",
        "fileduplicatesearch": "Maghanap ng kaparehong mga talaksan",
        "fileduplicatesearch-summary": "Maghanap ng mga kaparehong mga talaksan sa baba ng kanyang halaga ng ''hash''.",
-       "fileduplicatesearch-legend": "Maghanap ng mga kapareho",
        "fileduplicatesearch-filename": "Pangalan ng file:",
        "fileduplicatesearch-submit": "Hanapin",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />Laki ng talaksan: $3<br />Uri ng MIME: $4",
index 1b7236a..bd1e9fe 100644 (file)
        "exif-colorspace": "Renk aralığı",
        "exif-componentsconfiguration": "Her bileşenin anlamı",
        "exif-compressedbitsperpixel": "Resim sıkıştırma biçimi",
-       "exif-pixelydimension": "Resim genişliği",
-       "exif-pixelxdimension": "Resim yüksekliği",
+       "exif-pixelxdimension": "Resim genişliği",
+       "exif-pixelydimension": "Resim yüksekliği",
        "exif-usercomment": "Kullanıcı yorumu",
        "exif-relatedsoundfile": "İlişkin ses dosyası",
        "exif-datetimeoriginal": "Verinin ilk yaratılma zamanı",
index 98e7356..08c0e0f 100644 (file)
        "exif-colorspace": "Төсләр тирәлеге",
        "exif-componentsconfiguration": "Төсләр төзелешенең конфигурациясе",
        "exif-compressedbitsperpixel": "Кысылудан соң төснең тирәнлеге",
-       "exif-pixelydimension": "Рәсемнең киңлеге",
-       "exif-pixelxdimension": "Рәсемнең биеклеге",
+       "exif-pixelxdimension": "Рәсемнең киңлеге",
+       "exif-pixelydimension": "Рәсемнең биеклеге",
        "exif-usercomment": "Өстәмә җавап",
        "exif-relatedsoundfile": "Тавыш файлы җавабы",
        "exif-datetimeoriginal": "Чын вакыты",
index a78db9e..87298ce 100644 (file)
        "exif-colorspace": "Töslär tirälege",
        "exif-componentsconfiguration": "Töslär tözeleşeneñ konfiguratsiäse",
        "exif-compressedbitsperpixel": "Qısıludan soñ tösneñ tiränlege",
-       "exif-pixelydimension": "Räsemneñ tulı bieklege",
-       "exif-pixelxdimension": "Räsemneñ tulı kiñlege",
+       "exif-pixelxdimension": "Räsemneñ tulı bieklege",
+       "exif-pixelydimension": "Räsemneñ tulı kiñlege",
        "exif-usercomment": "Östämä cawap",
        "exif-relatedsoundfile": "Tawış faylı cawabı",
        "exif-datetimeoriginal": "Çın waqıtı",
index 2612631..3acf4d0 100644 (file)
        "exif-colorspace": "رەڭ بوشلۇقى",
        "exif-componentsconfiguration": "ھەر بىر تەركىپنىڭ سالمىقى",
        "exif-compressedbitsperpixel": "سۈرەت پرىسلاش شەكلى",
-       "exif-pixelydimension": "سۈرەت كەڭلىكى",
-       "exif-pixelxdimension": "سۈرەت ئېگىزلىكى",
+       "exif-pixelxdimension": "سۈرەت كەڭلىكى",
+       "exif-pixelydimension": "سۈرەت ئېگىزلىكى",
        "exif-usercomment": "ئىشلەتكۈچى ئىزاھاتى",
        "exif-relatedsoundfile": "مۇناسىۋەتلىك ئۈن ھۆججىتى",
        "exif-datetimeoriginal": "سانلىق مەلۇمات قۇرۇلغان چېسلا ۋە ۋاقىت",
index 78d3e9b..08e281c 100644 (file)
        "exif-colorspace": "Колірний простір",
        "exif-componentsconfiguration": "Конфігурація кольорових компонентів",
        "exif-compressedbitsperpixel": "Глибина кольору після стиснення",
-       "exif-pixelydimension": "Ширина зображення",
-       "exif-pixelxdimension": "Висота зображення",
+       "exif-pixelxdimension": "Ширина зображення",
+       "exif-pixelydimension": "Висота зображення",
        "exif-usercomment": "Додатковий коментар",
        "exif-relatedsoundfile": "Файл звукового коментаря",
        "exif-datetimeoriginal": "Оригинальні дата й час",
        "redirect-not-exists": "Значення не знайдено",
        "fileduplicatesearch": "Пошук файлів-дублікатів",
        "fileduplicatesearch-summary": "Пошук дублікатів файлів на основі хеш-значень.",
-       "fileduplicatesearch-legend": "Пошук дублікатів",
        "fileduplicatesearch-filename": "Назва файлу:",
        "fileduplicatesearch-submit": "Знайти",
        "fileduplicatesearch-info": "$1 × $2 пікселів<br />Розмір файлу: $3<br />MIME-тип: $4",
index eca9197..f890815 100644 (file)
        "pagemovedsub": "Sahifa qayta nomlandi",
        "movepage-moved": "'''Sahifa nomi «$1»dan «$2»ga koʻchirildi'''",
        "movepage-moved-redirect": "Qayta yo‘naltirish yaratildi.",
+       "articleexists": "Shunday nomli sahifa mavjud, yoki siz tanlagan nom mumkin emas. \nIltimos, boshqa nom tanlang.",
        "movetalk": "Mos munozara sahifasini qayta nomlash",
        "move-subpages": "Ostsahifalarni ham qayta nomlash ($1 tadan kam)",
        "move-talk-subpages": "Munozara sahifasining ostsahifalarini ham qayta nomlash ($1 tadan kam)",
index 6358cec..5ce9483 100644 (file)
        "exif-colorspace": "Spazio de i cołori",
        "exif-componentsconfiguration": "Significato de ciascuna componente",
        "exif-compressedbitsperpixel": "Modalità de compression imagine",
-       "exif-pixelydimension": "Larghesa imajine",
-       "exif-pixelxdimension": "Altesa imajine",
+       "exif-pixelxdimension": "Larghesa imajine",
+       "exif-pixelydimension": "Altesa imajine",
        "exif-usercomment": "Note de l'utente",
        "exif-relatedsoundfile": "File audio cołegà",
        "exif-datetimeoriginal": "Data e ora de creassion de i dati",
index 4ce72b4..5419b68 100644 (file)
        "exif-colorspace": "Mujuavaruz",
        "exif-componentsconfiguration": "Mujukomponentoiden konfiguracii",
        "exif-compressedbitsperpixel": "Mujun süvuz ahtištusen jäl'ghe",
-       "exif-pixelydimension": "Kuvan leveduz",
-       "exif-pixelxdimension": "Kuvan korktuz",
+       "exif-pixelxdimension": "Kuvan leveduz",
+       "exif-pixelydimension": "Kuvan korktuz",
        "exif-usercomment": "Kävutajan homaičendad",
        "exif-relatedsoundfile": "Kulundkommentarijan fail",
        "exif-datetimeoriginal": "Todesine dat da aig",
        "version-entrypoints-header-url": "URL",
        "fileduplicatesearch": "Ectä kaksitadud failad",
        "fileduplicatesearch-summary": "Ühtejiččiden failoiden ecmine niiden heš-kodan mödhe.",
-       "fileduplicatesearch-legend": "Ectä dublikatoid",
        "fileduplicatesearch-filename": "Failannimi:",
        "fileduplicatesearch-submit": "Ectä",
        "fileduplicatesearch-info": "$1 × $2 pikselad<br />Failan suruz: $3<br />MIME-tip: $4",
index dc92a01..3ca8f0c 100644 (file)
        "exif-colorspace": "Không gian màu",
        "exif-componentsconfiguration": "Ý nghĩa thành phần",
        "exif-compressedbitsperpixel": "Độ nén (bit/điểm)",
-       "exif-pixelydimension": "Chiều ngang hình",
-       "exif-pixelxdimension": "Chiều cao hình",
+       "exif-pixelxdimension": "Chiều ngang hình",
+       "exif-pixelydimension": "Chiều cao hình",
        "exif-usercomment": "Lời bình của tác giả",
        "exif-relatedsoundfile": "Tập tin âm thanh liên quan",
        "exif-datetimeoriginal": "Ngày giờ sinh dữ liệu",
index b98b3a5..cad647b 100644 (file)
        "exif-colorspace": "Kölaspad",
        "exif-componentsconfiguration": "Sinif komponena alik",
        "exif-compressedbitsperpixel": "Mod kobopedama magoda",
-       "exif-pixelydimension": "Magodavidot",
-       "exif-pixelxdimension": "Magodageilot",
+       "exif-pixelxdimension": "Magodavidot",
+       "exif-pixelydimension": "Magodageilot",
        "exif-usercomment": "Küpets gebana",
        "exif-relatedsoundfile": "Tonaragiv tefik",
        "exif-datetimeoriginal": "Dät e tim jafama nünodas",
index afd8d8d..3e1403c 100644 (file)
        "exif-colorspace": "Värmiruum",
        "exif-componentsconfiguration": "Egä osa tähendüs",
        "exif-compressedbitsperpixel": "Pildi kokkopakmismuud",
-       "exif-pixelydimension": "Kõlbolinõ pildi lakjus",
-       "exif-pixelxdimension": "Kõlbolinõ pildi korgus",
+       "exif-pixelxdimension": "Kõlbolinõ pildi lakjus",
+       "exif-pixelydimension": "Kõlbolinõ pildi korgus",
        "exif-usercomment": "Pruukja kommõntaariq",
        "exif-relatedsoundfile": "Manopant helüteedüstü",
        "exif-datetimeoriginal": "Luumisaig",
index dbcefa4..bae1ce5 100644 (file)
        "exif-artist": "Зокъялч",
        "exif-copyright": "Зокъялчин зөвәнә эзн",
        "exif-exifversion": "Exif'ин һарц",
-       "exif-pixelydimension": "Күцц зургин өндр",
-       "exif-pixelxdimension": "Күцц зургин өргн",
+       "exif-pixelxdimension": "Күцц зургин өндр",
+       "exif-pixelydimension": "Күцц зургин өргн",
        "exif-exposuretime": "Дәврдгсн цаг",
        "exif-exposuretime-format": "$1 с ($2)",
        "exif-contrast": "Зөрү",
index b86339e..dd0b17d 100644 (file)
        "exif-colorspace": "קאליר רוים",
        "exif-componentsconfiguration": "מיינונג פון יעדן באשטאנדטייל",
        "exif-compressedbitsperpixel": "בילד צוזאמקוועטשן מאוד",
-       "exif-pixelydimension": "בילד ברייט",
-       "exif-pixelxdimension": "בילד הייך",
+       "exif-pixelxdimension": "בילד ברייט",
+       "exif-pixelydimension": "בילד הייך",
        "exif-usercomment": "באניצער קאמענטורן",
        "exif-relatedsoundfile": "פֿאַרבונדענע אוידיאָ טעקע",
        "exif-datetimeoriginal": "דאטום און צייט פון דאַטן באשאפונג",
index 91af0ce..4afce94 100644 (file)
        "exif-colorspace": "Àyè àwọ̀",
        "exif-componentsconfiguration": "Ìtumọ̀ àkóónú kọ̀ọ̀kan",
        "exif-compressedbitsperpixel": "Àyè ìtẹ̀pọ̀ àwòrán",
-       "exif-pixelydimension": "Ìfẹ̀ àwòrán",
-       "exif-pixelxdimension": "Ìga àwòrán",
+       "exif-pixelxdimension": "Ìfẹ̀ àwòrán",
+       "exif-pixelydimension": "Ìga àwòrán",
        "exif-usercomment": "Àwọn àwìsọ oníṣe",
        "exif-relatedsoundfile": "Fáìlì ìfohùn tó jọra",
        "exif-datetimeoriginal": "Ọjọ́ àti àsìkò tí dátà jade",
index 8f01a17..bb65fac 100644 (file)
        "exif-colorspace": "色彩空間",
        "exif-componentsconfiguration": "每個部份嘅意思",
        "exif-compressedbitsperpixel": "影像壓縮模式",
-       "exif-pixelydimension": "影像闊度",
-       "exif-pixelxdimension": "影像高度",
+       "exif-pixelxdimension": "影像闊度",
+       "exif-pixelydimension": "影像高度",
        "exif-usercomment": "用家註腳",
        "exif-relatedsoundfile": "相關聲音檔",
        "exif-datetimeoriginal": "原創日期時間",
index 5d07d5e..29aa7bf 100644 (file)
        "exif-colorspace": "色彩空间",
        "exif-componentsconfiguration": "各部分含义",
        "exif-compressedbitsperpixel": "图像压缩模式",
-       "exif-pixelydimension": "图像宽度",
-       "exif-pixelxdimension": "图像高度",
+       "exif-pixelxdimension": "图像宽度",
+       "exif-pixelydimension": "图像高度",
        "exif-usercomment": "用户评论",
        "exif-relatedsoundfile": "相关声音文件",
        "exif-datetimeoriginal": "数据生成日期时间",
        "redirect-not-exists": "没找到相应值",
        "fileduplicatesearch": "搜索重复文件",
        "fileduplicatesearch-summary": "根据哈希(hash)值搜索重复文件。",
-       "fileduplicatesearch-legend": "搜索重复文件",
        "fileduplicatesearch-filename": "文件名:",
        "fileduplicatesearch-submit": "搜索",
        "fileduplicatesearch-info": "$1×$2像素<br />文件大小:$3<br />MIME类型:$4",
index 04c2333..456d23e 100644 (file)
        "nocookieslogin": "要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後重試。",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
        "noname": "您輸入的使用者名稱無效。",
-       "loginsuccesstitle": "登入成功",
+       "loginsuccesstitle": "已登入",
        "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
        "nosuchuser": "查無使用者 \"$1\"。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:UserLogin/signup|建立新帳號]]。",
        "nosuchusershort": "查無使用者 \"$1\",\n請檢查您拼寫是否正確。",
        "exif-colorspace": "色彩空間",
        "exif-componentsconfiguration": "每像素內含",
        "exif-compressedbitsperpixel": "影像壓縮模式",
-       "exif-pixelydimension": "圖片寬度",
-       "exif-pixelxdimension": "圖片高度",
+       "exif-pixelxdimension": "圖片寬度",
+       "exif-pixelydimension": "圖片高度",
        "exif-usercomment": "使用者評論",
        "exif-relatedsoundfile": "相關的音效檔案",
        "exif-datetimeoriginal": "資料產生的日期時間",
        "redirect-not-exists": "查無值",
        "fileduplicatesearch": "搜尋重複檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
-       "fileduplicatesearch-legend": "搜尋重複",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
index 68b6ea3..82b362b 100644 (file)
@@ -29,6 +29,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -111,9 +113,9 @@ class RebuildLocalisationCache extends Maintenance {
                        $pid = ( $threads > 1 ) ? pcntl_fork() : -1;
 
                        if ( $pid === 0 ) {
-                               // Child, reseed because there is no bug in PHP:
-                               // http://bugs.php.net/bug.php?id=42465
-                               mt_srand( getmypid() );
+                               // Reset services, so we don't re-use connections.
+                               MediaWikiServices::resetChildProcessServices();
+
                                $this->doRebuild( $codes, $lc, $force );
                                exit( 0 );
                        } elseif ( $pid === -1 ) {
index 5cc5681..270dbd4 100644 (file)
@@ -1200,6 +1200,7 @@ return [
                        'mediawiki.user',
                        'mediawiki.Upload',
                        'mediawiki.jqueryMsg',
+                       'mediawiki.widgets.StashedFileWidget'
                ],
                'messages' => [
                        'upload-form-label-infoform-title',
@@ -2241,7 +2242,19 @@ return [
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-
+       'mediawiki.widgets.StashedFileWidget' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.js',
+               ],
+               'skinStyles' => [
+                       'default' => [
+                               'resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less',
+                       ],
+               ],
+               'dependencies' => [
+                       'oojs-ui-core',
+               ],
+       ],
        /* es5-shim */
        'es5-shim' => [
                'scripts' => [
diff --git a/resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.js b/resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.js
new file mode 100644 (file)
index 0000000..cdcf5a2
--- /dev/null
@@ -0,0 +1,158 @@
+/*!
+ * MediaWiki Widgets - StashedFileWidget class.
+ *
+ * @copyright 2011-2016 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw, OO ) {
+
+       /**
+        * Accepts a stashed file and displays the information for purposes of
+        * publishing the file at the behest of the user.
+        *
+        * Example use:
+        *     var widget = new mw.widgets.StashedFileWidget( {
+        *       filekey: '12r9e4rugeec.ddtmmp.1.jpg',
+        *     } );
+        *
+        *     widget.getValue(); // '12r9e4rugeec.ddtmmp.1.jpg'
+        *     widget.setValue( '12r9epfbnskk.knfiy7.1.jpg' );
+        *     widget.getValue(); // '12r9epfbnskk.knfiy7.1.jpg'
+        *
+        * Note that this widget will not finish an upload for you. Use mw.Upload
+        * and mw.Upload#setFilekey, then mw.Upload#finishStashUpload to accomplish
+        * that.
+        *
+        * @class mw.widgets.StashedFileWidget
+        * @extends OO.ui.Widget
+        */
+
+       /**
+        * @constructor
+        * @param {Object} config Configuration options
+        * @cfg {string} filekey The filekey of the stashed file.
+        * @cfg {Object} [api] API to use for thumbnails.
+        */
+       mw.widgets.StashedFileWidget = function MWWStashedFileWidget( config ) {
+               if ( !config.api ) {
+                       config.api = new mw.Api();
+               }
+
+               // Parent constructor
+               mw.widgets.StashedFileWidget.parent.call( this, config );
+
+               // Mixin constructors
+               OO.ui.mixin.IconElement.call( this, config );
+               OO.ui.mixin.LabelElement.call( this, config );
+               OO.ui.mixin.PendingElement.call( this, config );
+
+               // Properties
+               this.api = config.api;
+               this.$info = $( '<span>' );
+               this.setValue( config.filekey );
+               this.$label.addClass( 'mw-widgets-stashedFileWidget-label' );
+               this.$info
+                       .addClass( 'mw-widgets-stashedFileWidget-info' )
+                       .append( this.$icon, this.$label );
+
+               this.$thumbnail = $( '<div>' ).addClass( 'mw-widgets-stashedFileWidget-thumbnail' );
+               this.setPendingElement( this.$thumbnail );
+
+               this.$thumbContain = $( '<div>' )
+                       .addClass( 'mw-widgets-stashedFileWidget-thumbnail-container' )
+                       .append( this.$thumbnail, this.$info );
+
+               this.$element
+                       .addClass( 'mw-widgets-stashedFileWidget' )
+                       .append( this.$thumbContain );
+
+               this.updateUI();
+       };
+
+       OO.inheritClass( mw.widgets.StashedFileWidget, OO.ui.Widget );
+       OO.mixinClass( mw.widgets.StashedFileWidget, OO.ui.mixin.IconElement );
+       OO.mixinClass( mw.widgets.StashedFileWidget, OO.ui.mixin.LabelElement );
+       OO.mixinClass( mw.widgets.StashedFileWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Get the current filekey.
+        *
+        * @return {string|null}
+        */
+       mw.widgets.StashedFileWidget.prototype.getValue = function () {
+               return this.filekey;
+       };
+
+       /**
+        * Set the filekey.
+        *
+        * @param {string|null} filekey
+        */
+       mw.widgets.StashedFileWidget.prototype.setValue = function ( filekey ) {
+               if ( filekey !== this.filekey ) {
+                       this.filekey = filekey;
+                       this.updateUI();
+                       this.emit( 'change', this.filekey );
+               }
+       };
+
+       mw.widgets.StashedFileWidget.prototype.updateUI = function () {
+               var $label, $filetype;
+
+               if ( this.filekey ) {
+                       this.$element.removeClass( 'mw-widgets-stashedFileWidget-empty' );
+                       $label = $( [] );
+                       $filetype = $( '<span>' )
+                               .addClass( 'mw-widgets-stashedFileWidget-fileType' );
+
+                       $label = $label.add(
+                               $( '<span>' )
+                                       .addClass( 'mw-widgets-stashedFileWidget-filekey' )
+                                       .text( this.filekey )
+                       ).add( $filetype );
+
+                       this.setLabel( $label );
+
+                       this.pushPending();
+                       this.loadAndGetImageUrl().done( function ( url, mime ) {
+                               this.$thumbnail.css( 'background-image', 'url( ' + url + ' )' );
+                               if ( mime ) {
+                                       $filetype.text( mime );
+                                       this.setLabel( $label );
+                               }
+                       }.bind( this ) ).fail( function () {
+                               this.$thumbnail.append(
+                                       new OO.ui.IconWidget( {
+                                               icon: 'attachment',
+                                               classes: [ 'mw-widgets-stashedFileWidget-noThumbnail-icon' ]
+                                       } ).$element
+                               );
+                       }.bind( this ) ).always( function () {
+                               this.popPending();
+                       }.bind( this ) );
+               } else {
+                       this.$element.addClass( 'mw-widgets-stashedFileWidget-empty' );
+                       this.setLabel( '' );
+               }
+       };
+
+       mw.widgets.StashedFileWidget.prototype.loadAndGetImageUrl = function () {
+               var filekey = this.filekey;
+
+               if ( filekey ) {
+                       return this.api.get( {
+                               action: 'query',
+                               prop: 'stashimageinfo',
+                               siifilekey: filekey,
+                               siiprop: [ 'size', 'url', 'mime' ],
+                               siiurlwidth: 220
+                       } ).then( function ( data ) {
+                               var sii = data.query.stashimageinfo[ 0 ];
+
+                               return $.Deferred().resolve( sii.thumburl, sii.mime );
+                       } );
+               }
+
+               return $.Deferred().reject( 'No filekey' );
+       };
+}( jQuery, mediaWiki, OO ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less b/resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less
new file mode 100644 (file)
index 0000000..cf9496f
--- /dev/null
@@ -0,0 +1,172 @@
+.mw-widgets-stashedFileWidget {
+       display: inline-block;
+       vertical-align: middle;
+       width: 100%;
+       max-width: 50em;
+       margin-right: 0.5em;
+
+       &:last-child {
+               margin-right: 0;
+       }
+
+       &.oo-ui-iconElement .mw-widgets-stashedFileWidget-info .mw-widgets-stashedFileWidget-label {
+               left: 2.875em;
+       }
+
+       &.oo-ui-indicatorElement .mw-widgets-stashedFileWidget-info .mw-widgets-stashedFileWidget-label {
+               right: 4.4625em;
+       }
+}
+
+.mw-widgets-stashedFileWidget-info {
+       height: 2.4em;
+       background-color: #ffffff;
+       border: 1px solid #cccccc;
+       border-radius: 2px;
+       width: 100%;
+       display: table-cell;
+       vertical-align: middle;
+       position: relative;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+
+       > .mw-widgets-stashedFileWidget-label {
+               line-height: 2.3em;
+               margin: 0;
+               overflow: hidden;
+               white-space: nowrap;
+               -webkit-box-sizing: border-box;
+                  -moz-box-sizing: border-box;
+                               box-sizing: border-box;
+               text-overflow: ellipsis;
+               left: 0.5em;
+               right: 2.375em;
+               position: absolute;
+               top: 0;
+               bottom: 0;
+
+               > .mw-widgets-stashedFileWidget-fileName {
+                       float: left;
+               }
+               > .mw-widgets-stashedFileWidget-fileType {
+                       color: #888888;
+                       float: right;
+               }
+       }
+
+       > .oo-ui-indicatorElement-indicator,
+       > .oo-ui-iconElement-icon {
+               position: absolute;
+       }
+
+       > .oo-ui-indicatorElement-indicator {
+               right: 0;
+               top: 0;
+               width: 0.9375em;
+               height: 2.3em;
+               margin-right: 0.775em;
+       }
+
+       > .oo-ui-iconElement-icon {
+               top: 0;
+               width: 1.875em;
+               height: 2.3em;
+               margin-left: 0.5em;
+               left: 0;
+       }
+
+       &.oo-ui-widget-disabled {
+               .mw-widgets-stashedFileWidget-info {
+                       color: #cccccc;
+                       text-shadow: 0 1px 1px #ffffff;
+                       border-color: #dddddd;
+                       background-color: #f3f3f3;
+
+                       > .oo-ui-iconElement-icon,
+                       > .oo-ui-indicatorElement-indicator {
+                               opacity: 0.2;
+                       }
+               }
+       }
+}
+
+.mw-widgets-stashedFileWidget-thumbnail-container {
+       cursor: default;
+       height: 5.5em;
+       text-align: left;
+       padding: 0;
+       background-color: #ffffff;
+       border: 1px solid #cccccc;
+       margin-bottom: 0.5em;
+       vertical-align: middle;
+       overflow: hidden;
+       border-radius: 2px;
+
+       .mw-widgets-stashedFileWidget-thumbnail {
+               height: 5.5em;
+               width: 5.5em;
+               position: absolute;
+               background-size: cover;
+               background-position: center center;
+
+               &.oo-ui-pendingElement-pending {
+                       background-size: auto;
+               }
+
+               > .mw-widgets-stashedFileWidget-noThumbnail-icon {
+                       opacity: 0.4;
+                       background-color: #cccccc;
+                       height: 5.5em;
+                       width: 5.5em;
+               }
+       }
+
+       .mw-widgets-stashedFileWidget-info {
+               border: none;
+               background: none;
+               display: block;
+               height: 100%;
+               width: auto;
+               margin-left: 5.5em;
+
+               > .mw-widgets-stashedFileWidget-label {
+                       position: relative;
+
+                       > .mw-widgets-stashedFileWidget-fileName {
+                               display: block;
+                               float: none;
+                       }
+
+                       > .mw-widgets-stashedFileWidget-fileType {
+                               display: block;
+                               float: none;
+                       }
+               }
+       }
+}
+
+
+.mw-widgets-stashedFileWidget-empty {
+       .mw-widgets-stashedFileWidget-thumbnail-container {
+               text-align: center;
+
+               .mw-widgets-stashedFileWidget-thumbnail,
+               .mw-widgets-stashedFileWidget-info {
+                       margin: 0;
+                       display: none;
+               }
+       }
+
+       .mw-widgets-stashedFileWidget-label {
+               color: #cccccc;
+               right: 0.5em;
+       }
+
+       &.oo-ui-indicatorElement {
+               .mw-widgets-stashedFileWidget-label {
+                       right: 2em;
+               }
+       }
+}
index 981a2e9..a6a0d8c 100644 (file)
                        }
 
                        function finishUpload( moreData ) {
-                               data = $.extend( data, moreData );
-                               data.filekey = filekey;
-                               data.action = 'upload';
-                               data.format = 'json';
-
-                               if ( !data.filename ) {
-                                       throw new Error( 'Filename not included in file data.' );
-                               }
-
-                               return api.postWithEditToken( data ).then( function ( result ) {
-                                       if ( result.upload && result.upload.warnings ) {
-                                               return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
-                                       }
-                                       return result;
-                               } );
+                               api.uploadFromStash( filekey, $.extend( data, moreData ) );
                        }
 
                        return this.upload( file, { stash: true, filename: data.filename } ).then(
                        );
                },
 
+               /**
+                * Finish an upload in the stash.
+                *
+                * @param {string} filekey
+                * @param {Object} data
+                */
+               uploadFromStash: function ( filekey, data ) {
+                       data.filekey = filekey;
+                       data.action = 'upload';
+                       data.format = 'json';
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       return this.postWithEditToken( data ).then( function ( result ) {
+                               if ( result.upload && result.upload.warnings ) {
+                                       return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
+                               }
+                               return result;
+                       } );
+               },
+
                needToken: function () {
                        return true;
                }
index 6af0edf..2b28cb4 100644 (file)
@@ -61,6 +61,7 @@
         * @constructor
         * @param {Object} config Configuration options
         * @cfg {jQuery} [$overlay] Overlay to use for widgets in the booklet
+        * @cfg {string} [filekey] Sets the stashed file to finish uploading. Overrides most of the file selection process, and fetches a thumbnail from the server.
         */
        mw.Upload.BookletLayout = function ( config ) {
                // Parent constructor
@@ -68,6 +69,8 @@
 
                this.$overlay = config.$overlay;
 
+               this.filekey = config.filekey;
+
                this.renderUploadForm();
                this.renderInfoForm();
                this.renderInsertForm();
 
                this.clear();
                this.upload = this.createUpload();
+
                this.setPage( 'upload' );
 
+               if ( this.filekey ) {
+                       this.setFilekey( this.filekey );
+               }
+
                return this.upload.getApi().then(
                        function ( api ) {
                                // If the user can't upload anything, don't give them the option to.
                        layout = this,
                        file = this.getFile();
 
-               this.setFilename( file.name );
-
                this.setPage( 'info' );
 
+               if ( this.filekey ) {
+                       if ( file === null ) {
+                               // Someone gonna get-a hurt real bad
+                               throw new Error( 'filekey not passed into file select widget, which is impossible. Quitting while we\'re behind.' );
+                       }
+
+                       // Stashed file already uploaded.
+                       deferred.resolve();
+                       this.uploadPromise = deferred;
+                       this.emit( 'fileUploaded' );
+                       return deferred;
+               }
+
+               this.setFilename( file.name );
+
                this.upload.setFile( file );
                // The original file name might contain invalid characters, so use our sanitized one
                this.upload.setFilename( this.getFilename() );
                var fieldset,
                        layout = this;
 
-               this.selectFileWidget = new OO.ui.SelectFileWidget( {
-                       showDropTarget: true
-               } );
+               this.selectFileWidget = this.getFileWidget();
                fieldset = new OO.ui.FieldsetLayout();
                fieldset.addItems( [ this.selectFileWidget ] );
                this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
 
-               // Validation
+               // Validation (if the SFW is for a stashed file, this never fires)
                this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
 
                this.selectFileWidget.on( 'change', function () {
                return this.uploadForm;
        };
 
+       /**
+        * Gets the widget for displaying or inputting the file to upload.
+        *
+        * @return {OO.ui.SelectFileWidget|mw.widgets.StashedFileWidget}
+        */
+       mw.Upload.BookletLayout.prototype.getFileWidget = function () {
+               if ( this.filekey ) {
+                       return new mw.widgets.StashedFileWidget( {
+                               filekey: this.filekey
+                       } );
+               }
+
+               return new OO.ui.SelectFileWidget( {
+                       showDropTarget: true
+               } );
+       };
+
        /**
         * Updates the file preview on the info form when a file is added.
         *
                this.selectFileWidget.setValue( file );
        };
 
+       /**
+        * Sets the filekey of a file already stashed on the server
+        * as the target of this upload operation.
+        *
+        * @protected
+        * @param {string} filekey
+        */
+       mw.Upload.BookletLayout.prototype.setFilekey = function ( filekey ) {
+               this.upload.setFilekey( this.filekey );
+               this.selectFileWidget.setValue( filekey );
+
+               this.onUploadFormChange();
+       };
+
        /**
         * Clear the values of all fields
         *
index 4a463b0..23b0900 100644 (file)
                this.filename = filename;
        };
 
+       /**
+        * Set the stashed file to finish uploading.
+        *
+        * @param {string} filekey
+        */
+       UP.setFilekey = function ( filekey ) {
+               var upload = this;
+
+               this.setState( Upload.State.STASHED );
+               this.stashPromise = $.Deferred().resolve( function ( data ) {
+                       return upload.api.uploadFromStash( filekey, data );
+               } );
+       };
+
        /**
         * Sets the filename based on the filename as it was on the upload.
         */
index 56108c9..0987c0f 100644 (file)
@@ -27,6 +27,7 @@
  * @file
  * @ingroup Testing
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * @ingroup Testing
@@ -244,6 +245,9 @@ class ParserTest {
                // "extra language links"
                // see https://gerrit.wikimedia.org/r/111390
                array_push( $wgExtraInterlanguageLinkPrefixes, 'mul' );
+
+               // Reset all services to be consistent with the new settings!
+               MediaWikiServices::resetGlobalInstance();
        }
 
        /**
@@ -1005,11 +1009,6 @@ class ParserTest {
 
                $this->databaseSetupDone = true;
 
-               # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
-               # It seems to have been fixed since (r55079?), but regressed at some point before r85701.
-               # This works around it for now...
-               ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
-
                # CREATE TEMPORARY TABLE breaks if there is more than one server
                if ( wfGetLB()->getServerCount() != 1 ) {
                        $this->useTemporaryTables = false;
@@ -1036,11 +1035,22 @@ class ParserTest {
                $this->db->insert( 'site_stats',
                        [ 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ] );
 
-               # Reinitialise the LocalisationCache to match the database state
-               Language::getLocalisationCache()->unloadAll();
+               $bootstrapConfig = MediaWikiServices::getInstance()->getBootstrapConfig();
+               $configOverrides = new HashConfig();
 
-               # Clear the message cache
-               MessageCache::singleton()->clear();
+               # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
+               # It seems to have been fixed since (r55079?), but regressed at some point before r85701.
+               # This works around it for now...
+               $objectCaches = [
+                               CACHE_DB => [ 'class' => 'HashBagOStuff' ],
+                       ] + $bootstrapConfig->get( 'ObjectCaches' );
+
+               $configOverrides->set( 'ObjectCaches', $objectCaches );
+
+               // Reset all services to be consistent with the new settings!
+               MediaWikiServices::resetGlobalInstance(
+                       new MultiConfig( [ $configOverrides, $bootstrapConfig ] )
+               );
 
                // Remember to update newParserTests.php after changing the below
                // (and it uses a slightly different syntax just for teh lulz)
@@ -1241,11 +1251,7 @@ class ParserTest {
         * after each test runs.
         */
        private function teardownGlobals() {
-               RepoGroup::destroySingleton();
-               FileBackendGroup::destroySingleton();
-               LockManagerGroup::destroySingletons();
-               LinkCache::singleton()->clear();
-               MWTidy::destroySingleton();
+               MediaWikiServices::resetGlobalInstance();
 
                foreach ( $this->savedGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
index a99b4b9..08785ea 100644 (file)
@@ -2,12 +2,23 @@
 use MediaWiki\Logger\LegacySpi;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Logger\MonologSpi;
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
 
 /**
  * @since 1.18
  */
 abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
+
+       /**
+        * The service locator created by prepareServices(). This service locator will
+        * be restored after each test. Tests that pollute the global service locator
+        * instance should use overrideMwServices() to isolate the test.
+        *
+        * @var MediaWikiServices|null
+        */
+       private static $serviceLocator = null;
+
        /**
         * $called tracks whether the setUp and tearDown method has been called.
         * class extending MediaWikiTestCase usually override setUp and tearDown
@@ -108,18 +119,204 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
-       public function run( PHPUnit_Framework_TestResult $result = null ) {
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+
+               // NOTE: Usually, PHPUnitMaintClass::finalSetup already called this,
+               // but let's make doubly sure.
+               self::prepareServices( new GlobalVarConfig() );
+       }
+
+       /**
+        * Prepare service configuration for unit testing.
+        *
+        * This calls MediaWikiServices::resetGlobalInstance() to allow some critical services
+        * to be overridden for testing.
+        *
+        * prepareServices() only needs to be called once, but should be called as early as possible,
+        * before any class has a chance to grab a reference to any of the global services
+        * instances that get discarded by prepareServices(). Only the first call has any effect,
+        * later calls are ignored.
+        *
+        * @note This is called by PHPUnitMaintClass::finalSetup.
+        *
+        * @see MediaWikiServices::resetGlobalInstance()
+        *
+        * @param Config $bootstrapConfig The bootstrap config to use with the new
+        *        MediaWikiServices. Only used for the first call to this method.
+        */
+       public static function prepareServices( Config $bootstrapConfig ) {
+               static $servicesPrepared = false;
+
+               if ( $servicesPrepared ) {
+                       return;
+               } else {
+                       $servicesPrepared = true;
+               }
+
+               self::resetGlobalServices( $bootstrapConfig );
+       }
+
+       /**
+        * Reset global services, and install testing environment.
+        * This is the testing equivalent of MediaWikiServices::resetGlobalInstance().
+        * This should only be used to set up the testing environment, not when
+        * runnnig unit tests. Use overrideMwServices() for that.
+        *
+        * @see MediaWikiServices::resetGlobalInstance()
+        * @see prepareServices()
+        * @see overrideMwServices()
+        *
+        * @param Config|null $bootstrapConfig The bootstrap config to use with the new
+        *        MediaWikiServices.
+        */
+       protected static function resetGlobalServices( Config $bootstrapConfig = null ) {
+               $oldServices = MediaWikiServices::getInstance();
+               $oldConfigFactory = $oldServices->getConfigFactory();
+
+               $testConfig = self::makeTestConfig( $bootstrapConfig );
+
+               MediaWikiServices::resetGlobalInstance( $testConfig );
+
+               self::$serviceLocator = MediaWikiServices::getInstance();
+               self::installTestServices(
+                       $oldConfigFactory,
+                       self::$serviceLocator
+               );
+       }
+
+       /**
+        * Create a config suitable for testing, based on a base config, default overrides,
+        * and custom overrdies.
+        *
+        * @param Config|null $baseConfig
+        * @param Config|null $customOverrides
+        *
+        * @return Config
+        */
+       private static function makeTestConfig(
+               Config $baseConfig = null,
+               Config $customOverrides = null
+       ) {
+               $defaultOverrides = new HashConfig();
+
+               if ( !$baseConfig ) {
+                       $baseConfig = MediaWikiServices::getInstance()->getBootstrapConfig();
+               }
+
                /* Some functions require some kind of caching, and will end up using the db,
                 * which we can't allow, as that would open a new connection for mysql.
                 * Replace with a HashBag. They would not be going to persist anyway.
                 */
-               ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
+               $hashCache = [ 'class' => 'HashBagOStuff' ];
+               $objectCaches = [
+                               CACHE_DB => $hashCache,
+                               CACHE_ACCEL => $hashCache,
+                               CACHE_MEMCACHED => $hashCache,
+                               'apc' => $hashCache,
+                               'xcache' => $hashCache,
+                               'wincache' => $hashCache,
+                       ] + $baseConfig->get( 'ObjectCaches' );
+
+               $defaultOverrides->set( 'ObjectCaches', $objectCaches );
+               $defaultOverrides->set( 'MainCacheType', CACHE_NONE );
+
+               $testConfig = $customOverrides
+                       ? new MultiConfig( [ $customOverrides, $defaultOverrides, $baseConfig ] )
+                       : new MultiConfig( [ $defaultOverrides, $baseConfig ] );
+
+               return $testConfig;
+       }
 
-               // Sandbox APC by replacing with in-process hash instead.
-               // Ensures values are removed between tests.
-               ObjectCache::$instances['apc'] =
-               ObjectCache::$instances['xcache'] =
-               ObjectCache::$instances['wincache'] = new HashBagOStuff;
+       /**
+        * @param ConfigFactory $oldConfigFactory
+        * @param MediaWikiServices $newServices
+        *
+        * @throws MWException
+        */
+       private static function installTestServices(
+               ConfigFactory $oldConfigFactory,
+               MediaWikiServices $newServices
+       ) {
+               // Use bootstrap config for all configuration.
+               // This allows config overrides via global variables to take effect.
+               $bootstrapConfig = $newServices->getBootstrapConfig();
+               $newServices->resetServiceForTesting( 'ConfigFactory' );
+               $newServices->redefineService(
+                       'ConfigFactory',
+                       self::makeTestConfigFactoryInstantiator(
+                               $oldConfigFactory,
+                               [ 'main' =>  $bootstrapConfig ]
+                       )
+               );
+       }
+
+       /**
+        * @param ConfigFactory $oldFactory
+        * @param Config[] $config
+        *
+        * @return Closure
+        */
+       private static function makeTestConfigFactoryInstantiator(
+               ConfigFactory $oldFactory,
+               array $configurations
+       ) {
+               return function( MediaWikiServices $services ) use ( $oldFactory, $configurations ) {
+                       $factory = new ConfigFactory();
+
+                       // clone configurations from $oldFactory that are not overwritten by $configurations
+                       $namesToClone = array_diff(
+                               $oldFactory->getConfigNames(),
+                               array_keys( $configurations )
+                       );
+
+                       foreach ( $namesToClone as $name ) {
+                               $factory->register( $name, $oldFactory->makeConfig( $name ) );
+                       }
+
+                       foreach ( $configurations as $name => $config ) {
+                               $factory->register( $name, $config );
+                       }
+
+                       return $factory;
+               };
+       }
+
+       /**
+        * Resets some well known services that typically have state that may interfere with unit tests.
+        * This is a lightweight alternative to resetGlobalServices().
+        *
+        * @note There is no guarantee that no references remain to stale service instances destroyed
+        * by a call to doLightweightServiceReset().
+        *
+        * @throws MWException if called outside of PHPUnit tests.
+        *
+        * @see resetGlobalServices()
+        */
+       private function doLightweightServiceReset() {
+               global $wgRequest;
+
+               $services = MediaWikiServices::getInstance();
+
+               JobQueueGroup::destroySingletons();
+               ObjectCache::clear();
+               FileBackendGroup::destroySingleton();
+
+               // TODO: move global state into MediaWikiServices
+               RequestContext::resetMain();
+               MediaHandler::resetCache();
+               if ( session_id() !== '' ) {
+                       session_write_close();
+                       session_id( '' );
+               }
+
+               $wgRequest = new FauxRequest();
+               MediaWiki\Session\SessionManager::resetCache();
+       }
+
+       public function run( PHPUnit_Framework_TestResult $result = null ) {
+               // Reset all caches between tests.
+               $this->doLightweightServiceReset();
 
                $needsResetDB = false;
 
@@ -289,6 +486,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
                $this->mwGlobals = [];
                $this->restoreLoggers();
+
+               if ( self::$serviceLocator && MediaWikiServices::getInstance() !== self::$serviceLocator ) {
+                       MediaWikiServices::forceGlobalInstance( self::$serviceLocator );
+               }
+
+               // TODO: move global state into MediaWikiServices
                RequestContext::resetMain();
                MediaHandler::resetCache();
                if ( session_id() !== '' ) {
@@ -324,6 +527,28 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * Sets a service, maintaining a stashed version of the previous service to be
+        * restored in tearDown
+        *
+        * @param string $name
+        * @param object $object
+        */
+       protected function setService( $name, $object ) {
+               // If we did not yet override the service locator, so so now.
+               if ( MediaWikiServices::getInstance() === self::$serviceLocator ) {
+                       $this->overrideMwServices();
+               }
+
+               MediaWikiServices::getInstance()->disableService( $name );
+               MediaWikiServices::getInstance()->redefineService(
+                       $name,
+                       function () use ( $object ) {
+                               return $object;
+                       }
+               );
+       }
+
        /**
         * Sets a global, maintaining a stashed version of the previous global to be
         * restored in tearDown
@@ -354,6 +579,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param mixed $value Value to set the global to (ignored
         *  if an array is given as first argument).
         *
+        * @note To allow changes to global variables to take effect on global service instances,
+        *       call overrideMwServices().
+        *
         * @since 1.21
         */
        protected function setMwGlobals( $pairs, $value = null ) {
@@ -381,6 +609,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param array|string $globalKeys Key to the global variable, or an array of keys.
         *
         * @throws Exception When trying to stash an unset global
+        *
+        * @note To allow changes to global variables to take effect on global service instances,
+        *       call overrideMwServices().
+        *
         * @since 1.23
         */
        protected function stashMwGlobals( $globalKeys ) {
@@ -421,6 +653,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @throws MWException If the designated global is not an array.
         *
+        * @note To allow changes to global variables to take effect on global service instances,
+        *       call overrideMwServices().
+        *
         * @since 1.21
         */
        protected function mergeMwGlobalArrayValue( $name, $values ) {
@@ -441,6 +676,52 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->setMwGlobals( $name, $merged );
        }
 
+       /**
+        * Stashes the global instance of MediaWikiServices, and installs a new one,
+        * allowing test cases to override settings and services.
+        * The previous instance of MediaWikiServices will be restored on tearDown.
+        *
+        * @since 1.27
+        *
+        * @param Config $configOverrides Configuration overrides for the new MediaWikiServices instance.
+        * @param callable[] $services An associative array of services to re-define. Keys are service
+        *        names, values are callables.
+        *
+        * @return MediaWikiServices
+        * @throws MWException
+        */
+       protected function overrideMwServices( Config $configOverrides = null, array $services = [] ) {
+               if ( !$configOverrides ) {
+                       $configOverrides = new HashConfig();
+               }
+
+               $oldInstance = MediaWikiServices::getInstance();
+               $oldConfigFactory = $oldInstance->getConfigFactory();
+
+               $testConfig = self::makeTestConfig( null, $configOverrides );
+               $newInstance = new MediaWikiServices( $testConfig );
+
+               // Load the default wiring from the specified files.
+               // NOTE: this logic mirrors the logic in MediaWikiServices::newInstance.
+               $wiringFiles = $testConfig->get( 'ServiceWiringFiles' );
+               $newInstance->loadWiringFiles( $wiringFiles );
+
+               // Provide a traditional hook point to allow extensions to configure services.
+               Hooks::run( 'MediaWikiServices', [ $newInstance ] );
+
+               foreach ( $services as $name => $callback ) {
+                       $newInstance->redefineService( $name, $callback );
+               }
+
+               self::installTestServices(
+                       $oldConfigFactory,
+                       $newInstance
+               );
+               MediaWikiServices::forceGlobalInstance( $newInstance );
+
+               return $newInstance;
+       }
+
        /**
         * @since 1.27
         * @param string|Language $lang
@@ -475,6 +756,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param LoggerInterface $logger
         */
        protected function setLogger( $channel, LoggerInterface $logger ) {
+               // TODO: Once loggers are managed by MediaWikiServices, use
+               //       overrideMwServices() to set loggers.
+
                $provider = LoggerFactory::getProvider();
                $wrappedProvider = TestingAccessWrapper::newFromObject( $provider );
                $singletons = $wrappedProvider->singletons;
@@ -566,6 +850,10 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $user = User::newFromName( 'UTSysop' );
                $comment = __METHOD__ . ': Sample page for unit test.';
 
+               // Avoid memory leak...?
+               // LinkCache::singleton()->clear();
+               // Maybe.  But doing this absolutely breaks $title->isRedirect() when called during unit tests....
+
                $page = WikiPage::factory( $title );
                $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
 
@@ -765,6 +1053,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        return;
                }
 
+               // TODO: the below should be re-written as soon as LBFactory, LoadBalancer,
+               // and DatabaseBase no longer use global state.
+
                self::$dbSetup = true;
 
                if ( !self::setupDatabaseWithTestPrefix( $db, $prefix ) ) {
index 127f869..96abf97 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Services\ServiceDisabledException;
 
 /**
  * @covers MediaWiki\MediaWikiServices
@@ -8,22 +9,203 @@ use MediaWiki\MediaWikiServices;
  */
 class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @return Config
+        */
+       private function newTestConfig() {
+               $globalConfig = new GlobalVarConfig();
+
+               $testConfig = new HashConfig();
+               $testConfig->set( 'ServiceWiringFiles', $globalConfig->get( 'ServiceWiringFiles' ) );
+               $testConfig->set( 'ConfigRegistry', $globalConfig->get( 'ConfigRegistry' ) );
+
+               return $testConfig;
+       }
+
+       /**
+        * @return MediaWikiServices
+        */
+       private function newMediaWikiServices( Config $config = null ) {
+               if ( $config === null ) {
+                       $config = $this->newTestConfig();
+               }
+
+               $instance = new MediaWikiServices( $config );
+
+               // Load the default wiring from the specified files.
+               $wiringFiles = $config->get( 'ServiceWiringFiles' );
+               $instance->loadWiringFiles( $wiringFiles );
+
+               return $instance;
+       }
+
        public function testGetInstance() {
                $services = MediaWikiServices::getInstance();
                $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $services );
        }
 
+       public function testForceGlobalInstance() {
+               $newServices = $this->newMediaWikiServices();
+               $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
+
+               $this->assertInstanceOf( 'MediaWiki\\MediaWikiServices', $oldServices );
+               $this->assertNotSame( $oldServices, $newServices );
+
+               $theServices = MediaWikiServices::getInstance();
+               $this->assertSame( $theServices, $newServices );
+
+               MediaWikiServices::forceGlobalInstance( $oldServices );
+
+               $theServices = MediaWikiServices::getInstance();
+               $this->assertSame( $theServices, $oldServices );
+       }
+
+       public function testResetGlobalInstance() {
+               $newServices = $this->newMediaWikiServices();
+               $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
+
+               MediaWikiServices::resetGlobalInstance( $this->newTestConfig() );
+               $theServices = MediaWikiServices::getInstance();
+
+               $this->assertNotSame( $theServices, $newServices );
+               $this->assertNotSame( $theServices, $oldServices );
+
+               MediaWikiServices::forceGlobalInstance( $oldServices );
+       }
+
+       public function testDisableStorageBackend() {
+               $newServices = $this->newMediaWikiServices();
+               $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
+
+               $lbFactory = $this->getMockBuilder( 'LBFactorySimple' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $lbFactory->expects( $this->once() )
+                       ->method( 'destroy' );
+
+               $newServices->redefineService(
+                       'DBLoadBalancerFactory',
+                       function() use ( $lbFactory ) {
+                               return $lbFactory;
+                       }
+               );
+
+               // force the service to become active, so we can check that it does get destroyed
+               $newServices->getService( 'DBLoadBalancerFactory' );
+
+               MediaWikiServices::disableStorageBackend(); // should destroy DBLoadBalancerFactory
+
+               try {
+                       MediaWikiServices::getInstance()->getService( 'DBLoadBalancerFactory' );
+                       $this->fail( 'DBLoadBalancerFactory shoudl have been disabled' );
+               }
+               catch ( ServiceDisabledException $ex ) {
+                       // ok, as expected
+               }
+               catch ( Throwable $ex ) {
+                       $this->fail( 'ServiceDisabledException expected, caught ' . get_class( $ex ) );
+               }
+
+               MediaWikiServices::forceGlobalInstance( $oldServices );
+       }
+
+       public function testResetChildProcessServices() {
+               $newServices = $this->newMediaWikiServices();
+               $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
+
+               $lbFactory = $this->getMockBuilder( 'LBFactorySimple' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $lbFactory->expects( $this->once() )
+                       ->method( 'destroy' );
+
+               $newServices->redefineService(
+                       'DBLoadBalancerFactory',
+                       function() use ( $lbFactory ) {
+                               return $lbFactory;
+                       }
+               );
+
+               // force the service to become active, so we can check that it does get destroyed
+               $oldLBFactory = $newServices->getService( 'DBLoadBalancerFactory' );
+
+               MediaWikiServices::resetChildProcessServices();
+               $finalServices = MediaWikiServices::getInstance();
+
+               $newLBFactory = $finalServices->getService( 'DBLoadBalancerFactory' );
+
+               $this->assertNotSame( $oldLBFactory, $newLBFactory );
+
+               MediaWikiServices::forceGlobalInstance( $oldServices );
+       }
+
+       public function testResetServiceForTesting() {
+               $services = $this->newMediaWikiServices();
+               $serviceCounter = 0;
+
+               $services->defineService(
+                       'Test',
+                       function() use ( &$serviceCounter ) {
+                               $serviceCounter++;
+                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service->expects( $this->once() )->method( 'destroy' );
+                               return $service;
+                       }
+               );
+
+               // This should do nothing. In particular, it should not create a service instance.
+               $services->resetServiceForTesting( 'Test' );
+               $this->assertEquals( 0, $serviceCounter, 'No service instance should be created yet.' );
+
+               $oldInstance = $services->getService( 'Test' );
+               $this->assertEquals( 1, $serviceCounter, 'A service instance should exit now.' );
+
+               // The old instance should be detached, and destroy() called.
+               $services->resetServiceForTesting( 'Test' );
+               $newInstance = $services->getService( 'Test' );
+
+               $this->assertNotSame( $oldInstance, $newInstance );
+
+               // Satisfy the expectation that destroy() is called also for the second service instance.
+               $newInstance->destroy();
+       }
+
+       public function testResetServiceForTesting_noDestroy() {
+               $services = $this->newMediaWikiServices();
+
+               $services->defineService(
+                       'Test',
+                       function() {
+                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service->expects( $this->never() )->method( 'destroy' );
+                               return $service;
+                       }
+               );
+
+               $oldInstance = $services->getService( 'Test' );
+
+               // The old instance should be detached, but destroy() not called.
+               $services->resetServiceForTesting( 'Test', false );
+               $newInstance = $services->getService( 'Test' );
+
+               $this->assertNotSame( $oldInstance, $newInstance );
+       }
+
        public function provideGetters() {
-               // NOTE: This should list all service getters defined in MediaWikiServices.
-               // NOTE: For every test case defined here there should be a corresponding
-               // test case defined in provideGetService().
-               return [
-                       'BootstrapConfig' => [ 'getBootstrapConfig', Config::class ],
-                       'ConfigFactory' => [ 'getConfigFactory', ConfigFactory::class ],
-                       'MainConfig' => [ 'getMainConfig', Config::class ],
-                       'SiteStore' => [ 'getSiteStore', SiteStore::class ],
-                       'SiteLookup' => [ 'getSiteLookup', SiteLookup::class ],
-               ];
+               $getServiceCases = $this->provideGetService();
+               $getterCases = [];
+
+               // All getters should be named just like the service, with "get" added.
+               foreach ( $getServiceCases as $name => $case ) {
+                       $getterCases[$name] = [
+                               'get' . $case[0],
+                               $case[1]
+                       ];
+               }
+
+               return $getterCases;
        }
 
        /**
@@ -46,6 +228,9 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'MainConfig' => [ 'MainConfig', Config::class ],
                        'SiteStore' => [ 'SiteStore', SiteStore::class ],
                        'SiteLookup' => [ 'SiteLookup', SiteLookup::class ],
+                       'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
+                       'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
+                       'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                ];
        }
 
index cf34b18..97852cf 100644 (file)
@@ -15,12 +15,12 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::__construct
         * @dataProvider provideConstructor
         */
-       public function testConstructor( $expectedLang, $key, $params, $language ) {
+       public function testConstructor( Language $expectedLang, $key, $params, $language ) {
                $message = new Message( $key, $params, $language );
 
                $this->assertEquals( $key, $message->getKey() );
                $this->assertEquals( $params, $message->getParams() );
-               $this->assertEquals( $expectedLang, $message->getLanguage() );
+               $this->assertEquals( $expectedLang->getCode(), $message->getLanguage()->getCode() );
 
                $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
                $messageSpecifier->expects( $this->any() )
@@ -31,7 +31,7 @@ class MessageTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( $key, $message->getKey() );
                $this->assertEquals( $params, $message->getParams() );
-               $this->assertEquals( $expectedLang, $message->getLanguage() );
+               $this->assertEquals( $expectedLang->getCode(), $message->getLanguage()->getCode() );
        }
 
        public static function provideConstructor() {
index 942c45e..933777c 100644 (file)
@@ -69,11 +69,53 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'InvalidArgumentException' );
+               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
 
                $services->getService( $name );
        }
 
+       public function testPeekService() {
+               $services = $this->newServiceContainer();
+
+               $services->defineService(
+                       'Foo',
+                       function() {
+                               return new stdClass();
+                       }
+               );
+
+               $services->defineService(
+                       'Bar',
+                       function() {
+                               return new stdClass();
+                       }
+               );
+
+               // trigger instantiation of Foo
+               $services->getService( 'Foo' );
+
+               $this->assertInternalType(
+                       'object',
+                       $services->peekService( 'Foo' ),
+                       'Peek should return the service object if it had been accessed before.'
+               );
+
+               $this->assertNull(
+                       $services->peekService( 'Bar' ),
+                       'Peek should return null if the service was never accessed.'
+               );
+       }
+
+       public function testPeekService_fail_unknown() {
+               $services = $this->newServiceContainer();
+
+               $name = 'TestService92834576';
+
+               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
+
+               $services->peekService( $name );
+       }
+
        public function testDefineService() {
                $services = $this->newServiceContainer();
 
@@ -99,7 +141,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                        return $theService;
                } );
 
-               $this->setExpectedException( 'RuntimeException' );
+               $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
 
                $services->defineService( $name, function() use ( $theService ) {
                        return $theService;
@@ -147,7 +189,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                ];
 
                // loading the same file twice should fail, because
-               $this->setExpectedException( 'RuntimeException' );
+               $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
 
                $services->loadWiringFiles( $wiringFiles );
        }
@@ -184,7 +226,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $this->setExpectedException( 'RuntimeException' );
+               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
 
                $services->redefineService( $name, function() use ( $theService ) {
                        return $theService;
@@ -204,11 +246,101 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                // create the service, so it can no longer be redefined
                $services->getService( $name );
 
-               $this->setExpectedException( 'RuntimeException' );
+               $this->setExpectedException( 'MediaWiki\Services\CannotReplaceActiveServiceException' );
+
+               $services->redefineService( $name, function() use ( $theService ) {
+                       return $theService;
+               } );
+       }
+
+       public function testDisableService() {
+               $services = $this->newServiceContainer( [ 'Foo' ] );
+
+               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible->expects( $this->once() )
+                       ->method( 'destroy' );
+
+               $services->defineService( 'Foo', function() use ( $destructible ) {
+                       return $destructible;
+               } );
+               $services->defineService( 'Bar', function() {
+                       return new stdClass();
+               } );
+               $services->defineService( 'Qux', function() {
+                       return new stdClass();
+               } );
+
+               // instantiate Foo and Bar services
+               $services->getService( 'Foo' );
+               $services->getService( 'Bar' );
+
+               // disable service, should call destroy() once.
+               $services->disableService( 'Foo' );
+
+               // disabled service should still be listed
+               $this->assertContains( 'Foo', $services->getServiceNames() );
+
+               // getting other services should still work
+               $services->getService( 'Bar' );
+
+               // disable non-destructible service, and not-yet-instantiated service
+               $services->disableService( 'Bar' );
+               $services->disableService( 'Qux' );
+
+               $this->assertNull( $services->peekService( 'Bar' ) );
+               $this->assertNull( $services->peekService( 'Qux' ) );
+
+               // disabled service should still be listed
+               $this->assertContains( 'Bar', $services->getServiceNames() );
+               $this->assertContains( 'Qux', $services->getServiceNames() );
+
+               // re-enable Bar service
+               $services->redefineService( 'Bar', function() {
+                       return new stdClass();
+               } );
+
+               $services->getService( 'Bar' );
+
+               $this->setExpectedException( 'MediaWiki\Services\ServiceDisabledException' );
+               $services->getService( 'Qux' );
+       }
+
+       public function testDisableService_fail_undefined() {
+               $services = $this->newServiceContainer();
+
+               $theService = new stdClass();
+               $name = 'TestService92834576';
+
+               $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
 
                $services->redefineService( $name, function() use ( $theService ) {
                        return $theService;
                } );
        }
 
+       public function testDestroy() {
+               $services = $this->newServiceContainer();
+
+               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible->expects( $this->once() )
+                       ->method( 'destroy' );
+
+               $services->defineService( 'Foo', function() use ( $destructible ) {
+                       return $destructible;
+               } );
+
+               $services->defineService( 'Bar', function() {
+                       return new stdClass();
+               } );
+
+               // create the service
+               $services->getService( 'Foo' );
+
+               // destroy the container
+               $services->destroy();
+
+               $this->setExpectedException( 'MediaWiki\Services\ContainerDisabledException' );
+               $services->getService( 'Bar' );
+       }
+
 }
index 9dd38df..78231c2 100644 (file)
@@ -1,12 +1,11 @@
 <?php
-use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 
 /**
  * @author Addshore
  *
  * @covers WatchedItemStore
  */
-class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
+class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
        /**
         * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
@@ -96,17 +95,6 @@ class WatchedItemStoreUnitTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( $instanceOne, $instanceTwo );
        }
 
-       public function testOverrideDefaultInstance() {
-               $instance = WatchedItemStore::getDefaultInstance();
-               $scopedOverride = $instance->overrideDefaultInstance( null );
-
-               $this->assertNotSame( $instance, WatchedItemStore::getDefaultInstance() );
-
-               unset( $scopedOverride );
-
-               $this->assertSame( $instance, WatchedItemStore::getDefaultInstance() );
-       }
-
        public function testCountWatchedItems() {
                $user = $this->getMockNonAnonUserWithId( 1 );
 
index b4eaa76..db7f16c 100644 (file)
@@ -5,13 +5,30 @@
  *
  * @covers WatchedItem
  */
-class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
+class WatchedItemUnitTest extends MediaWikiTestCase {
+
+       /**
+        * @param int $id
+        *
+        * @return PHPUnit_Framework_MockObject_MockObject|User
+        */
+       private function getMockUser( $id ) {
+               $user = $this->getMock( User::class );
+               $user->expects( $this->any() )
+                       ->method( 'getId' )
+                       ->will( $this->returnValue( $id ) );
+               $user->expects( $this->any() )
+                       ->method( 'isAllowed' )
+                       ->will( $this->returnValue( true ) );
+               return $user;
+       }
 
        public function provideUserTitleTimestamp() {
+               $user = $this->getMockUser( 111 );
                return [
-                       [ User::newFromId( 111 ), Title::newFromText( 'SomeTitle' ), null ],
-                       [ User::newFromId( 111 ), Title::newFromText( 'SomeTitle' ), '20150101010101' ],
-                       [ User::newFromId( 111 ), new TitleValue( 0, 'TVTitle', 'frag' ), '20150101010101' ],
+                       [ $user, Title::newFromText( 'SomeTitle' ), null ],
+                       [ $user, Title::newFromText( 'SomeTitle' ), '20150101010101' ],
+                       [ $user, new TitleValue( 0, 'TVTitle', 'frag' ), '20150101010101' ],
                ];
        }
 
@@ -51,15 +68,13 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                        ->method( 'loadWatchedItem' )
                        ->with( $user, $linkTarget )
                        ->will( $this->returnValue( new WatchedItem( $user, $linkTarget, $timestamp ) ) );
-               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
+               $this->setService( 'WatchedItemStore', $store );
 
                $item = WatchedItem::fromUserTitle( $user, $linkTarget, User::IGNORE_USER_RIGHTS );
 
                $this->assertEquals( $user, $item->getUser() );
                $this->assertEquals( $linkTarget, $item->getLinkTarget() );
                $this->assertEquals( $timestamp, $item->getNotificationTimestamp() );
-
-               ScopedCallback::consume( $scopedOverride );
        }
 
        /**
@@ -85,12 +100,10 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                                        return true;
                                }
                        ) );
-               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
+               $this->setService( 'WatchedItemStore', $store );
 
                $item = new WatchedItem( $user, $linkTarget, $timestamp );
                $item->resetNotificationTimestamp( $force, $oldid );
-
-               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testAddWatch() {
@@ -157,17 +170,15 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                $store->expects( $this->once() )
                        ->method( 'duplicateAllAssociatedEntries' )
                        ->with( $oldTitle, $newTitle );
-               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
+               $this->setService( 'WatchedItemStore', $store );
 
                WatchedItem::duplicateEntries( $oldTitle, $newTitle );
-
-               ScopedCallback::consume( $scopedOverride );
        }
 
        public function testBatchAddWatch() {
-               $itemOne = new WatchedItem( User::newFromId( 1 ), new TitleValue( 0, 'Title1' ), null );
+               $itemOne = new WatchedItem( $this->getMockUser( 1 ), new TitleValue( 0, 'Title1' ), null );
                $itemTwo = new WatchedItem(
-                       User::newFromId( 3 ),
+                       $this->getMockUser( 3 ),
                        Title::newFromText( 'Title2' ),
                        '20150101010101'
                );
@@ -193,11 +204,9 @@ class WatchedItemUnitTest extends PHPUnit_Framework_TestCase {
                                        $itemTwo->getTitle()->getTalkPage(),
                                ]
                        );
-               $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
+               $this->setService( 'WatchedItemStore', $store );
 
                WatchedItem::batchAddWatch( [ $itemOne, $itemTwo ] );
-
-               ScopedCallback::consume( $scopedOverride );
        }
 
 }
index 2288507..2c1d1e6 100644 (file)
@@ -8,17 +8,71 @@ class ConfigFactoryTest extends MediaWikiTestCase {
        public function testRegister() {
                $factory = new ConfigFactory();
                $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
-               $this->assertTrue( true ); // No exception thrown
+               $this->assertInstanceOf( GlobalVarConfig::class, $factory->makeConfig( 'unittest' ) );
+       }
+
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testRegisterInvalid() {
+               $factory = new ConfigFactory();
                $this->setExpectedException( 'InvalidArgumentException' );
                $factory->register( 'invalid', 'Invalid callback' );
        }
 
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testRegisterInstance() {
+               $config = GlobalVarConfig::newInstance();
+               $factory = new ConfigFactory();
+               $factory->register( 'unittest', $config );
+               $this->assertSame( $config, $factory->makeConfig( 'unittest' ) );
+       }
+
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testRegisterAgain() {
+               $factory = new ConfigFactory();
+               $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
+               $config1 = $factory->makeConfig( 'unittest' );
+
+               $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
+               $config2 = $factory->makeConfig( 'unittest' );
+
+               $this->assertNotSame( $config1, $config2 );
+       }
+
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testGetConfigNames() {
+               $factory = new ConfigFactory();
+               $factory->register( 'foo', 'GlobalVarConfig::newInstance' );
+               $factory->register( 'bar', new HashConfig() );
+
+               $this->assertEquals( [ 'foo', 'bar' ], $factory->getConfigNames() );
+       }
+
        /**
         * @covers ConfigFactory::makeConfig
         */
        public function testMakeConfig() {
                $factory = new ConfigFactory();
                $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
+
+               $conf = $factory->makeConfig( 'unittest' );
+               $this->assertInstanceOf( 'Config', $conf );
+               $this->assertSame( $conf, $factory->makeConfig( 'unittest' ) );
+       }
+
+       /**
+        * @covers ConfigFactory::makeConfig
+        */
+       public function testMakeConfigFallback() {
+               $factory = new ConfigFactory();
+               $factory->register( '*', 'GlobalVarConfig::newInstance' );
                $conf = $factory->makeConfig( 'unittest' );
                $this->assertInstanceOf( 'Config', $conf );
        }
@@ -48,10 +102,10 @@ class ConfigFactoryTest extends MediaWikiTestCase {
         * @covers ConfigFactory::getDefaultInstance
         */
        public function testGetDefaultInstance() {
+               // NOTE: the global config factory returned here has been overwritten
+               // for operation in test mode. It may not reflect LocalSettings.
                $factory = ConfigFactory::getDefaultInstance();
                $this->assertInstanceOf( 'Config', $factory->makeConfig( 'main' ) );
-
-               $this->setExpectedException( 'ConfigException' );
-               $factory->makeConfig( 'xyzzy' );
        }
+
 }
index 77690cd..d876c45 100755 (executable)
@@ -139,6 +139,10 @@ class PHPUnitMaintClass extends Maintenance {
                // may break testing against floating point values
                // treated with PHP's serialize()
                ini_set( 'serialize_precision', 17 );
+
+               // TODO: we should call MediaWikiTestCase::prepareServices( new GlobalVarConfig() ) here.
+               // But PHPUnit may not be loaded yet, so we have to wait until just
+               // before PHPUnit_TextUI_Command::main() is executed at the end of this file.
        }
 
        public function execute() {
@@ -237,4 +241,9 @@ echo defined( 'HHVM_VERSION' ) ?
        'Using HHVM ' . HHVM_VERSION . ' (' . PHP_VERSION . ")\n" :
        'Using PHP ' . PHP_VERSION . "\n";
 
+// Prepare global services for unit tests.
+// FIXME: this should be done in the finalSetup() method,
+// but PHPUnit may not have been loaded at that point.
+MediaWikiTestCase::prepareServices( new GlobalVarConfig() );
+
 $wgPhpUnitClass::main();